2012-01-11 79 views
0

我正在使用vb.net。我有一个datagridview来显示数据。由于需要的datagridview一个滤波函数,我的datagridview的底层数据表和筛选表的数据的视图:vb.net我的设计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_table中的column1第一次在上面的代码后实际上是空的,所以datagridview也是空的,因为它的数据源是m_table。我别无选择,只能再次调用上面的子更新datagridview。这是低效的。

问题是我想保持过滤器简单,那么底层表似乎是必要的。但该表没有作为控件失效。所以表不能更新值。我必须再次打电话给我的小组更新表格。

如何保持过滤器的简单性以及如何使用datagridview.invalidate更新值以便我的子不需要再次调用? 任何帮助apprecaited。

回答

0

您不应在每次要用不同的 字符串过滤DataGrid时创建新视图,而只需更新当前默认视图的过滤器。 在分离问题的相同想法中,只需将一次您的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 
+0

感谢您的回答。我想知道为什么每次创建新视图都不是一个好主意。我尝试了你的答案,并且像我以前的代码一样过滤得很好。我猜这样更有效率? – Summer 2012-01-17 17:53:52

+0

那么它会更有效率,是的,也更可重用。不要这样做,如果你不需要。顺便说一句,如果我认为我理解了'显示'后1步:刷新完成是因为您更改了DataContext,并且您的DataTable中的更改没有反映出来。看来如果你使用的是DataView,你应该以不同的方式处理所有这些。我没有时间写代码/测试,但看看这个 http://msdn.microsoft.com/en-us/library/70k6287b(VS.71).aspx例如。 – GameAlchemist 2012-01-17 20:39:14

+0

感谢您的回答。我的问题很难解释清楚。我会这样离开它。但是你的回答给了我一些我以前不知道的东西。 – Summer 2012-01-17 21:03:47