2017-10-13 19 views
0

複数の年のグループを選択して電子メールアドレスのリストを照合するオプションを最終的に与えるアプリを作成し始めました。複数のチェックボックスを使用してdataGridViewで検索

これまでのところ、私はdataGridViewボックスにExcelファイルをインポートして、項目をフィルタリングすることができました。たとえば、「Year 7」というフィルタを適用することができます。 「Year 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 

答えて

0

チェックボックスをオンにするたびに、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 
+0

使用した方法が表示されますが、それでもエラーが表示されます。 –

0

ありがとうございます。

私は、プロパティにタグを追加し、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 
関連する問題