我正在寻找一种更好的方法来填充我的DGV,并填充约12个组合框。组合框的作用类似于DGV的“过滤器”(即,“姓氏” CB将过滤DGV中的“ Last_Name”列。)目前,我使用SQL查询来填充DGV,然后使用单独的查询来填充每个DGV。 CB的。每次在CB中更改选择时,都会使用更多查询来更新DGV和所有CB,以仅包括SQL查询中可用的值。 (级联组合框?)很明显,这会带来很多开销,并且每次搜索条件发生变化时,查询所有这些表都将花费大量时间。
我决定尝试用该应用程序所需的所有表填充单个DataSet。从该数据集中,我创建一个DataView作为DGV的数据源。然后,我可以过滤DGV,而不是每次“搜索条件”更改时都运行新的查询。这行得通,有点。当过滤DataView时,它确实会更新,但是DGV和CB直接链接到DataView,因此,当您在DGV中选择某些内容时,CB选择会更改。
我需要用DGV中可用的值(仅DGV中的值)填充每个组合框,以防止用户选择会返回0结果的任何内容。填充的CB还应按字母顺序与DISTINCT值进行排序。每次CB值更改时,都应使用CB值对DataView进行过滤,然后DGV和所有其他CB应该更新为仅DataView中再次可用的内容。
我尝试使用DataBindings,但是我确定我没有正确使用它,因为它仅显示选定的DGV值。
我也尝试过使用CB的DataSource和DisplayMember。当DGV被过滤时,此操作会更新,但是我不知道如何将列表排序。
任何帮助将不胜感激!
这是我用来填写所有内容的当前代码:
Module SQL
Public dvMain As DataView
Public dsAllData As DataSet
Public Sub FillDGV()
Dim SQLcmd As New SqlCommand With {
.Connection = Vars.sqlConndb,
.CommandText = "
Select * From [db].[data_1]
Select * From [db].[data_2]
Select * From [db].[data_3]
Select * From [db].[data_4]
Select * From [db].[data_5]
Select * From [db].[data_6]
Select * From [db].[data_7]
Select * From [db].[data_8]
Select * From [db].[data_9]
Select * From [db].[tbl_1]
Select * From [db].[tbl_2]
Select * From [db].[tbl_3]
Select * From [db].[tbl_4]
Select * From [db].[tbl_5]
Select * From [db].[tbl_6]
Select * From [db].[tbl_7]
Select * From [db].[tbl_8]
Select * From [db].[tbl_9]"
}
dsAllData = New DataSet
Dim adapter As New SqlDataAdapter With {
.SelectCommand = SQLcmd
}
Vars.sqlConndb.Open()
adapter.Fill(dsAllData)
Vars.sqlConndb.Close()
dvMain = New DataView(dsAllData.Tables(0))
If Not IsNothing(SQLcmd) Then SQLcmd.Dispose()
If Not IsNothing(adapter) Then adapter.Dispose()
End Sub
End Module
这是填写DGV和CB的FORM代码:
Public Class frmDGV
Dim mybindsource As New BindingSource
Private Sub frmDGV_Load(sender As Object, e As EventArgs) Handles Me.Load
FillDGV()
End Sub
Private Sub FillCombobox()
Me.ComboBox1.DataBindings.Add(New Binding("Text", SQL.dvMain, "First_Name"))
With Me.ComboBox2
.DisplayMember = "Last_Name"
.DataSource = SQL.dvMain
End With
End Sub
Private Sub btnFill_Click(sender As Object, e As EventArgs) Handles btnFill.Click
Me.dgvMain.DataSource = SQL.dvMain
FillCombobox()
End Sub
Private Sub btnFilter_Click(sender As Object, e As EventArgs) Handles btnFilter.Click
dvMain.RowFilter = "[Last_Name] Like '*Smith*' And [Gender] = 'Male'"
dgvMain.Refresh()
End Sub
End Class