【问题标题】:Faux Databinding a Recordset to a Datagridview将 Recordset 虚假数据绑定到 Datagridview
【发布时间】:2014-01-20 17:41:48
【问题描述】:

我正在更新一个非常旧的 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

虽然有几件事。我必须跟踪是否已经创建了事件处理程序,以及与此特定数据网格视图相关的记录集。此外,由于这是一个用许多 rs 更新许多 dgv 的全局函数,它需要有一种方法来跟踪记录集。我正在考虑以某种方式使用 dgv 的标签?也许创建一个包含所有记录集的字典,然后通过 dgv 的名称查找它?

【问题讨论】:

  • 有。它有效,但由于我是菜鸟,我无法再发布 8 个小时的答案。 :-)

标签: vb.net data-binding datagridview ado recordset


【解决方案1】:

下面是我原来的方法,效果很好。我最终对其进行了改进,并将其放入每个记录集的类中。我还更新了它以接受真正的 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。

顺便说一句,我知道可能还有其他方法可以做到这一点,我非常希望听到它们!请随意!

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    相关资源
    最近更新 更多