vb.net我的datagridview设计的困境

vb.net我的datagridview设计的困境,vb.net,Vb.net,我正在使用vb.net。我有一个datagridview来显示数据。因为datagridview需要一个filter函数,所以我有一个datagridview的底层数据表,并过滤数据表的视图: PassFilter(m_table,"Price>0") Private Sub PassFilter(ByRef dataTable As DataTable, ByVal strFilter As String) Try Dim dataview As

我正在使用vb.net。我有一个datagridview来显示数据。因为datagridview需要一个filter函数,所以我有一个datagridview的底层数据表,并过滤数据表的视图:

     PassFilter(m_table,"Price>0")
    Private Sub PassFilter(ByRef dataTable As DataTable, ByVal strFilter As String)     Try
        Dim dataview As New DataView(dataTable)
        dataview.RowFilter = strFilter
        'DGVTable is my datagridview
        DGVTable.DataSource = dataview
End Sub
这很有效。但我在以下代码中遇到了问题:

      Private Sub UpdateTable()
      Dim row as dataRow=m_table.NewRow
      row("column1")=GetText()
      m_table.Rows.Add(row)
      End Sub
请注意,GetText似乎是在另一个线程上运行的,该线程第一次返回上述代码之后的值。我不清楚为什么会发生这种情况,但第二次调用GetText时,它似乎可以直接获取值,这意味着m_表中的column1在第一次执行上述代码之后实际上是空的,所以datagridview也是空的,因为它的数据源是m_table。我别无选择,只能再次调用上面的子函数来更新datagridview。这是低效的

问题是我想保持过滤器简单,那么底层表似乎是必要的。但该表没有“无效为”控件。所以表不能更新值。我必须再次呼叫我的sub以更新表

如何使筛选器保持简单,并使用datagridview.invalidate更新值,以便无需再次调用我的sub?
欢迎提供任何帮助。

每次要使用不同的视图筛选数据网格时,不应创建新视图 字符串,但只更新当前默认视图的过滤器。 在分离关注点的相同思想中,只需将DataTable的默认视图分配给 您的DataGridView。 给出一个能产生如下代码的想法:

' SetFilter : Set the current filter of MyDataTable to strFilter
Private Sub SetFilter(ByVal MyDataTable As DataTable, ByVal strFilter As String)
    Dim DefaultViewOfMyDataTable As DataView = MyDataTable.DefaultView
    DefaultViewOfMyDataTable.RowFilter = strFilter
End Sub

' And Somewhere else in the code / or in the xaml
' you put this sub that you should in the new or the loaded() sub of your window.

' InitDataGridView : Assign MyDataTable to MyDGV DataGridView
Private Sub InitDataGridView(MyDGV As DataGridView, MyDataTable As DataTable)
    MyDGV.DataSource = MyDataTable.DefaultView
End Sub

谢谢你的回答。我想知道为什么每次都创建一个新的视图不是一个好主意。我尝试了你的答案,它和我以前的代码一样过滤良好。我想它更有效?嗯,它会更有效,是的,而且更可重用。如果你不需要,就不要做。顺便说一下,如果我理解了“1步之后”显示:刷新完成是因为您更改了DataContext,而DataTable中的更改不会以其他方式反映出来。如果您使用的是DataView,那么您应该以不同的方式处理所有这些问题。我没有时间写代码/测试,但看看这个例子。谢谢你的回答。我的问题真的很难解释清楚。我就这样不谈了。但是你的回答告诉我一些我以前不知道的事情。是的,有时候虫子会变得一团糟。。。直到天亮,突然,在一个星期天的早晨!!:-很高兴我能帮忙。