我有一个包含多个datagridviews(DGV)的解决方案,现在有多个绑定源(BS)和OleDbDataAdapters(ODA)。
这源于我在标签控件中有多个DGV的事实,我想在每个DGV中显示数据库中的不同表格,以及能够从DGV返回CRUD。
使用一个BS和ODA,当我输入每个标签时,通过切换BS.DataMember
,我能够在正确的DGV中显示所有正确的表格。这很有效,因为我每个标签只有一个DGV。
我遇到问题的地方是回到数据库。我发现我发现的大多数例子都涉及为每个表使用BS和ODA。这似乎不够优雅,所以如果有办法将DGV的DataSource
绑定到特定的BS.Datamember
,我很想知道它。
默认使用多个BS和ODA,我可以从一个Sub中提取更新任何DGV上的任何脏行所需的DGV,表名和BS。我没想到的是,是否有办法获得原来用于填补表格的官方发展援助。在代码中:
Private Sub UniversalDGV_Handler_LeaveRow(sender As Object, e As DataGridViewCellEventArgs) _
Handles DGV1.RowLeave, DGV2.RowLeave, '...' DGVn.RowLeave
Dim DGV As DataGridView = CType(sender, DataGridView)
Dim bsPass As BindingSource = DGV.DataSource
Dim CurrentDBTableName As String = bsPass.DataMember
Dim da as OleDbDataAdapter = 'something I haven't figured out yet
UniversalDGV_RowLeave(sender, CurrentDBTableName, e, bsPass, da)
End Sub
现在实际上,我拥有的DGV数量最多的是7,所以我刚刚制作了一份匹配的清单并以这种方式拉出了官方发展援助。但这再次看起来非常粗糙。
有没有办法从其填充的表中检索使用了哪个DataAdapter
,DataSet
使用了它,[BS或DGV]?
来自BS或DGV的信息似乎有点牵强,因为他们没有从我的理解中与ODA直接互动。我也在考虑将信息存储在数据集中,因为我使用了适配器,这至少是一个更优雅的列表/表。
答案 0 :(得分:0)
我通过仔细浏览properties of the DataTable Class找到答案。
通过使用DataTable.ExtendedProperties()
,您可以存储填充表格时使用的DataAdapter。代码示例:
Dim ds as DataSet
Dim BS1 as New BindingSource
Dim da1, da2, da3 as New OleDbDataAdapter
Private Sub DoSomething(da as OleDbDataAdapter)
ds.Tables.Add(New DataTable(DBTableName))
ds.Tables(DBTableName).ExtendedProperties("DataAdapter", da)
End Sub
Private Sub DoesSomethingElse() handles DGV1.Rowleave, DGV2.RowLeave, '...' DGVn.RowLeave
Dim DGV As DataGridView = CType(sender, DataGridView)
Dim bsPass As BindingSource = DGV.DataSource
Dim CurrentDBTableName As String = bsPass.DataMember
Dim RecalledDA as OleDbDataAdapter = ds.Tables(CurrentDBTableName).ExtendedProperties("DataAdapter")
'Do something with it. In my case I have a seperate sub I run it all into'
UniversalDGV_RowLeave(sender, CurrentDBTableName, e, da)
End Sub
由于我没有接受过正式培训,所以其他人都知道这一点,但我希望我可以节省一些时间来解决这个问题。
使用此功能,您可以为所有DGV使用一个BS,假设您一次只显示一个。如果您显示多个需要BS的DGV,我认为您仍然需要每个DGV一个BS。