2014-01-20 37 views
0

我正在更新包含綁定到舊的第三方網格控件的記錄集的非常舊的vb6程序。記錄集功能如此深入到程序中,因此不能替代它們。所以,我用datagridview替換了不起作用的網格,並使用dataadapter和數據集填充它。問題是記錄集最初綁定到網格,並使用dgv打破綁定。仿數據綁定到Datagridview的記錄集

所以這就是我想要做的。我有一個函數傳入舊的記錄集和新的dgv,並填充它。我想爲dgv的selectionchanged事件創建一個動態處理函數,用dgv(rs.aboluteposition = dgv.row)上的當前位置更新rs,從而將rs光標更新爲dgv中的當前位置,進行排序人造數據綁定。

事情是這樣的....

AddHandler dgv.SelectionChanged, AddressOf RefreshRecordset 

Public Sub RefreshRecordset() 

    myRS.AbsolutePosition = dgv.Row 

End Sub 

有兩件事情雖然。我必須跟蹤事件處理程序是否已經創建,以及與此特定datagridview一起使用的關聯記錄集。另外,由於這是一個用許多rs更新許多dgvs的全局函數,它需要有一種方法來跟蹤記錄集。我想用某種方式使用dgv的標籤?也許創建一個所有記錄集的字典,然後通過dgv的名稱查找它?

+0

有。它工作,但我不能張貼自從我是一個noob後的另外8個小時的答案。 :-) – Spiffy577

回答

0

下面是我工作得很好的原始方法。我最終完善了它,並將它放在每個記錄集的一個類中。我也更新它接受真正的dbgrids。通過將它包裝在課堂中,我可以刪除字典。在New函數中,我傳遞了網格和記錄集。從那裏,我設置了事件處理程序來處理網格行更改以及記錄集MoveComplete事件。我必須使用MoveComplete,因爲RecordsetChangeComplete有一個錯誤,並且不總是正確地啓動。如果記錄數已經改變,我只需檢查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。

順便說一句,我知道有可能有其他方法來做到這一點,我絕對會喜歡聽到他們!請隨時!

謝謝!