我在DataGridViewer
中获得了Form B
,而我listbox
中有Form A
。 Form 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")
答案 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