如何填充DGV,然后将组合框绑定到DGV列?

时间:2019-06-19 14:00:33

标签: vb.net visual-studio

我正在寻找一种更好的方法来填充我的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

0 个答案:

没有答案