过滤DataGridView中的数据

时间:2014-06-15 07:19:44

标签: vb.net winforms datagridview listbox filtering

我在DataGridViewer中获得了Form B,而我listbox中有Form AForm A始终首先打开,在LoadEvent中我添加了以下代码:

ds = CreateDataset()
frm_Tasks.DataGridView1.DataSource = ds.Tables("Task")
LoadFromXMLfile("C:\Users\Beta4K\Documents\Tasks.FILE")
  For Each dr As DataRow In ds.Tables(0).Rows
      ListBox1.Items.Add(dr("Task Name").ToString())
  Next

这样做是因为它读取了Tasks.FILE中的所有项目,并将它们添加到Form B中的DataGrdViewer中。现在在Form A我有3个项目的组合框。第1项,第2项第3项。这些是项目,在我的DataGridViewer中,当加载所有数据时,我的第5列有Item1或Item 2或Item 3.这些根据用户选择的内容而有所不同。

我想要做的是,一旦将项目加载到listbox Form A中,一旦用户从组合框中选择项目2,我希望列表框仅显示所有项目第5栏第2项。基本上过滤了DataGridViewer,以便它只显示第5列中Item 2的所有项目。

如果令人困惑,请告诉我,但在此之前,如果你能帮助我,我们将不胜感激。

更新

Dim ds As DataSet
Dim dataset1 As New DataSet("Tasks")
Dim table1 As New DataTable("Task")
Private Sub frm_MainMenu_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ds = CreateDataset()
    frm_Tasks.DataGridView1.DataSource = ds.Tables("Task")
    LoadFromXMLfile("C:\Users\Beta4K\Documents\Tasks.FILE")
    For Each dr As DataRow In ds.Tables(0).Rows
        ListBox1.Items.Add(dr("Task Name").ToString())
    Next

End Sub

Private Sub btn_Tasks_Click(sender As Object, e As EventArgs) Handles btn_Tasks.Click
    frm_Tasks.ShowDialog()
End Sub

Private Sub LoadFromXMLfile(filename As String)
    If System.IO.File.Exists(filename) Then
        Dim xmlSerializer As XmlSerializer = New XmlSerializer(ds.GetType)
        Dim readStream As FileStream = New FileStream(filename, FileMode.Open)
        ds = CType(xmlSerializer.Deserialize(readStream), DataSet)
        readStream.Close()
        frm_Tasks.DataGridView1.DataSource = ds.Tables("Task")
    Else
        MsgBox("file not found! add data and press save button first.", MsgBoxStyle.Exclamation, "")
    End If
End Sub
Private Function CreateDataset() As DataSet
    table1.Columns.Add("Task ID")
    table1.Columns.Add("Task Name")
    table1.Columns.Add("Task Message")
    table1.Columns.Add("Task Date")
    table1.Columns.Add("Task Time")
    table1.Columns.Add("Task Group")
    dataset1.Tables.Add(table1)
    Return dataset1
End Function

更新2 Brandon B帮助我解决了问题。它现在使用以下方式过滤行:

 Dim dv As New DataView(ds.Tables("tableTask"))
    dv.RowFilter = "TaskGroup = 'Inbox'"
    frm_Tasks.DataGridView1.DataSource = dv.ToTable("Temp_table")

2 个答案:

答案 0 :(得分:1)

您可以使用DataView执行此操作。一旦你必须填写DataTable

DataTable dtTable = new DataTable();
dtTable.Columns.Add("Column1");
dtTable.Columns.Add("Column2");

然后,您必须从创建的DataView创建DataTable对象。

DataView dvSource = dtTable.DefaultView;

现在,您可以将DataView对象分配给您的网格或任何其他列表控件。

dataGridView.DataSource = dvSource;

现在,您可以使用DataGridView属性过滤DataView.RowFilter

dvSource.RowFilter = 'Column1='" + cmbCombo.Text + "'";

您的网格将仅显示已过滤的项目。

答案 1 :(得分:1)

您需要实现数据视图和行过滤器。

private sub listbox_gridviewFilter(sender as listbox, e as eventargs) handles listbox1.selectedvaluechanged
    dim dv as new dataview(ds.Tables("Task"))        
    dv.RowFilter = "Task Name = '" & sender.selecteditem.tostring & "'"
    frm_Tasks.DataGridView1.DataSource = dv.totable("Temp_table")

end sub

为了使其正常工作,您还需要将ds表格设为全局或公共属性。我没有可用的Visual Studio,所以你可能需要检查我的语法并纠正任何拼写错误,但我很确定我从内存中得到它。


修改

发生了很多事情,我很难跟上这一切。我添加了很多注释,并在加载XML的部分中升级了错误处理。我不确定为什么你试图将表添加到单独的数据集时,就好像你的XML阅读器为你返回一个数据集一样。看一看,看看这是否有帮助。我唯一不确定的是当你在行过滤器中使用它时,列名称中有一个空格,“任务名称”。它可能需要用单引号括起来,但我不确定。

Imports System.Xml.Serialization
Imports System.IO

Public Class Name_of_Form ' Need to change this to the name of the form

    Private ds As DataSet ' Made this private to the form, unless you need it across multiple forms then change Private to Public.
    ' Dim dataset1 As New DataSet("Tasks") ' you don't need this because you XML load is going to populate a DataSet for you
    ' Dim table1 As New DataTable("Task") ' You don't need this either because of the same
    Private Sub frm_MainMenu_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' ds = CreateDataset() ' The dataset is is going to be returned in your XML loader
        LoadFromXMLfile("C:\Users\Beta4K\Documents\Tasks.FILE")
        frm_Tasks.DataGridView1.DataSource = ds.Tables("Task") ' Moved this below the XML loader, because you shouldn't set to something that isn't there yet...
        For Each dr As DataRow In ds.Tables(0).Rows
            ListBox1.Items.Add(dr("Task Name").ToString())
        Next

    End Sub

    Private Sub btn_Tasks_Click(sender As Object, e As EventArgs) Handles btn_Tasks.Click
        ' from your post it sounds like the user needs to have both forms open, so changing this to just show.
        ' frm_Tasks.ShowDialog()
        frm_Tasks.Show()
    End Sub

    Private Sub LoadFromXMLfile(filename As String)
        'adding some better error handling to see if your file isn't loading properly
        Try
            If System.IO.File.Exists(filename) Then
                Dim xmlSerializer As XmlSerializer = New XmlSerializer(ds.GetType)
                Dim readStream As FileStream = New FileStream(filename, FileMode.Open)
                ds = CType(xmlSerializer.Deserialize(readStream), DataSet) ' this looks like it is returning a dataset. If I'm wrong, then everything I have here isn't going to work.
                readStream.Close()
                ' You don't need this line because I moved the same call in the Load method, I'm commenting it out.
                'frm_Tasks.DataGridView1.DataSource = ds.Tables("Task")
            Else
                Throw New Exception("file not found! add data and press save button first.")
            End If

            If IsNothing(ds) Then Throw New Exception("Nothing loaded into the DataSet")
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Exclamation, "")
        End Try
    End Sub

    ' This is not really doing anything now. You said this is all your code, so since I commented out the call to it, I comenting this out too
    'Private Function CreateDataset() As DataSet
    '    table1.Columns.Add("Task ID")
    '    table1.Columns.Add("Task Name")
    '    table1.Columns.Add("Task Message")
    '    table1.Columns.Add("Task Date")
    '    table1.Columns.Add("Task Time")
    '    table1.Columns.Add("Task Group")
    '    dataset1.Tables.Add(table1)
    '    Return dataset1
    'End Function

    Private Sub listbox_gridviewFilter(sender As ListBox, e As EventArgs) Handles ListBox1.SelectedValueChanged
        Dim dv As New dataview(ds.Tables("Task"))
        dv.RowFilter = "Task Name = '" & sender.selecteditem.tostring & "'"
        frm_Tasks.DataGridView1.DataSource = dv.totable("Temp_table")

    End Sub
End Class