我正在更新一个非常古老的vb6程序,其中包括绑定到旧的第三方网格控件的记录集。记录集功能根深蒂固于程序中,因此无法替换它们。因此,我用datagridview替换了无功能网格,然后使用dataadapter和数据集填充它。问题是记录集最初绑定到网格,并使用dgv打破绑定。
所以这就是我想要做的。我有一个传递旧记录集和新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更新许多dgv的全局函数,因此需要有一种方法来跟踪记录集。我想用某种方式使用dgv的标签?也许创建一个包含所有记录集的字典,然后通过dgv的名称查找它?
答案 0 :(得分:0)
以下是我原来的方法,效果很好。我最终对它进行了改进,并将其放在每个记录集的类中。我还更新了它以接受真正的dbgrids。通过将它包装在一个类中,我能够删除字典。在New函数中,我传入grid和recordset。从那里,我设置事件处理程序来处理网格行更改和记录集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。
顺便说一句,我知道可能有其他方法可以做到这一点,我绝对会喜欢听到它们!请随意!
谢谢!