2014-01-20 3 views
0

이전 타사 그리드 컨트롤에 바인딩 된 레코드 세트를 포함하는 매우 오래된 vb6 프로그램을 업데이트하고 있습니다. 레코드 세트 기능은 프로그램에 너무 뿌려져있어 프로그램을 대체 할 수있는 옵션이 아닙니다. 그래서, 나는 비표준 그리드를 datagridview로 대체하고 dataadapter와 dataset을 사용하여 채 웁니다. 문제는 레코드 세트가 원래 모눈에 바인딩되어 있고 dgv를 사용하면 바인딩이 손상된다는 것입니다.Faux Datagridview에 대한 레코드 집합의 데이터 바인딩

이것이 내가하려는 일입니다. 이전 레코드 세트와 새로운 dgv를 전달하는 함수가 있고 그것을 채 웁니다. dgv (rs.aboluteposition = dgv.row)의 현재 위치로 rs를 업데이트하기 위해 dgv의 selectionchanged 이벤트에 대한 동적 처리기를 작성하여 rs 커서를 dgv의 현재 위치로 업데이트하여 정렬을 작성합니다. 가짜 데이터 바인딩.

이런 식으로 뭔가 ....하지만

AddHandler dgv.SelectionChanged, AddressOf RefreshRecordset 

Public Sub RefreshRecordset() 

    myRS.AbsolutePosition = dgv.Row 

End Sub 

몇 가지. 이벤트 핸들러가 이미 생성되었는지,이 특정 DataGridview와 연결된 레코드 세트를 추적해야합니다. 또한이 함수는 많은 rs로 많은 dgv를 업데이트하는 전역 함수이므로 레코드 세트를 추적 할 수있는 방법이 필요합니다. 어떻게 든 dgv의 태그를 사용하려고 생각 했나요? 어쩌면 모든 레코드 세트의 사전을 만든 다음에 dgv의 이름으로 찾으십시오.

+0

있습니다. 그것은 효과가 있었지만 나는 멍청하기 때문에 또 다른 8 시간 동안 대답을 게시 할 수 없다. :-) – Spiffy577

답변

0

다음은 꽤 잘 작동 한 나의 원래 방법입니다. 결국 그것을 세련시키고 각 레코드 세트의 클래스에 넣었습니다. 또한 dbgrids를 받아들이도록 업데이트했습니다. 수업에서 랩핑함으로써 사전을 삭제할 수있었습니다. New 함수에서는 그리드와 레코드 세트를 전달합니다. 거기에서 그리드 행 변경과 레코드 세트 MoveComplete 이벤트를 처리하는 이벤트 핸들러를 설정합니다. RecordsetChangeComplete에 버그가 있고 항상 올바르게 실행되지는 않기 때문에 MoveComplete를 사용해야했습니다. 레코드 수가 변경된 경우 MoveComplete를 체크인합니다. 그렇다면 눈금을 새로 고칩니다. 마지막으로, finalize 함수의 각 이벤트에 대해 removehandler를 추가했습니다.

//////이 같은 오리지널 대답 ////// 예를 들어

는, (내가이 일을 믿을 수 없어 ...)

Public dict as new Dictionary(Of String, ADODB.Recordset) 

    Public Sub FillGrid(ByRef dgv as DataGridView, ByRef rs as ADODB.RecordSet) 
    '.... Fill the grid with the tableadapter, blah blah. 

     If Not dict.ContainsValue(rs) Then 
     dict.add(dgv.Name, rs) 
     AddHandler dgv.SelectionChanged, AddressOf RefreshRecordset) 
     ' To make the event fire correctly, I think 
     dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect 
     End if 

    End Sub 

    Public Sub RefreshRecordset(sender As Object, e As System.EventArgs) 
     Dim dgv as DataGridView = Ctype(sender, DataGridView) 
     If dict.ContainsKey(dgv.Name) then 
      Dim rs as ADODB.Recordset = dict(dgv.Name) 
      rs.AbsolutePosition = dgv.CurrentCell.RowIndex 
     End if 
    End Sub 

이제 레코드 세트가 업데이트 될 때마다 dgv를 새로 고치기 위해 레코드 세트의 핸들러를 생성해야합니다.

그리고 btw, 나는 아마 이것을 할 다른 방법이 있고 나는 절대적으로 그들을 듣고 싶을 것이다! 기분이 자유 롭다!

감사합니다.