【问题标题】:Search through dataGridView using multiple checkboxes使用多个复选框搜索 dataGridView
【发布时间】:2018-03-26 01:21:35
【问题描述】:

我已经开始创建一个应用程序,它最终可以让某人选择多个年份组并整理电子邮件地址列表。

到目前为止,我已将一个 excel 文件导入到 dataGridView 框中并设法过滤掉项目,例如,我过滤了“第 7 年”。一旦我选择“第 8 年”,之前的搜索就会消失。有时我需要同时选择 7 年级、8 年级和 9 年级。

这是我目前所拥有的。

最初我认为我可以创建一个 if 语句,但它似乎只是搜索语句中的最后一件事。

Public Class Form1
Dim MyConnection As System.Data.OleDb.OleDbConnection
Dim dataSet As System.Data.DataSet
Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
Dim path As String = "C:\Users\Lenovo\Desktop\Username finder\data.xlsx"
Dim dv As DataView


Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Try

        MyConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;")
        MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [usernames$]", MyConnection)

        dataSet = New System.Data.DataSet
        MyCommand.Fill(dataSet)
        DataGridView1.DataSource = dataSet.Tables(0)

        MyConnection.Close()
    Catch ex As Exception
        MsgBox(ex.Message.ToString)
    End Try

End Sub


Private Sub CheckBoxY7_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBoxY7.CheckedChanged

    ' dv = New DataView(dataSet.Tables(0), "Year = '7' ", "Surname Desc", DataViewRowState.CurrentRows)
    ' DataGridView1.DataSource = dv
End Sub

Private Sub CheckBoxY8_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBoxY8.CheckedChanged
    ' dv = New DataView(dataSet.Tables(0), "Year = '8' ", "Surname Desc", DataViewRowState.CurrentRows)
    ' DataGridView1.DataSource = dv
End Sub

【问题讨论】:

    标签: vb.net search checkbox import datagrid


    【解决方案1】:

    感谢那些回答的人。

    我已经完成了一个解决方案,为属性添加标签并编写for循环。

        For Each ctrl In Panel1.Controls
            If (ctrl.GetType() Is GetType(CheckBox)) Then
                chkbox = ctrl
                If chkbox.Checked = True Then
                    If FirstLoop Then
                        qstring = ctrl.Tag
                        FirstLoop = False
                    Else
                        qstring = qstring & " or " & ctrl.Tag
                    End If
                End If
            End If
        Next
        ResultBox.Text = qstring
        dv = New DataView(dataSet.Tables(0), qstring, "Surname Desc", DataViewRowState.CurrentRows)
        DataGridView1.DataSource = dv
    

    【讨论】:

      【解决方案2】:

      每次选中复选框时,DataView 都会丢失之前的 RowFilter。您要做的是使用所有选中的 CheckBox 控件构建 RowFilter。看看这个例子:

      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
          Try
      
              MyConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;")
              MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [usernames$]", MyConnection)
      
              dataSet = New System.Data.DataSet
              MyCommand.Fill(dataSet)
              DataGridView1.DataSource = dataSet.Tables(0)
      
              MyConnection.Close()
          Catch ex As Exception
              MsgBox(ex.Message.ToString)
          End Try
      
          CheckBoxY7.Tag = "7"
          CheckBoxY8.Tag = "8"
          'etc...
      End Sub
      
      Private Sub Year_CheckBox_CheckChanged(ByVal sender As Object, ByVal e As EventArgs) Handles CheckBoxY7.Checked, CheckBoxY8.Checked
        Dim row_filter As String = String.Join(" AND ", (From cb As CheckBox In {CheckBoxY7, CheckBoxY8} Where cb.Checked Select $"Year = '{cb.Tag.ToString()}'").ToArray())
        DataGridView1.DataSource = New DataView(dataSet.Tables(0), row_filter, "Surname Desc", DataViewRowState.CurrentRows)
      End Sub
      

      【讨论】:

      • 我看到您使用的方法,但仍然报错。
      猜你喜欢
      • 2018-06-20
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多