我已将DataGrid绑定到DataTable,并且只有少数细节显示在网格中。当我想过滤DataGrid时,我使用DataGrid的ItemsSource创建了一个View。 代码:
Dim myView As ICollectionView = CollectionViewSource.GetDefaultView(MyDGrid.ItemsSource)
myView.Filter = New Predicate(Of Object)(AddressOf filterFunc1)
现在,当我进行搜索时,未显示的字段也包含在搜索中。
Public Function filterFunc1(ByVal obj As Object) As Boolean
Dim filStr As String = "*" & TextBox1.Text & "*"
For Each item As String In obj.Row.ItemArray
**If item.ToLower Like filStr.ToLower Then**
Return True
End If
Next
Return False
End Function
此外,我在DataGrid中有ComboBox字段,这些字段与其他DataTable分开加载。现在我不能将它们包含在搜索中。
我的应用程序的截图:
那么如何进行仅包含“显示的文本”部分的搜索。
编辑:另外如何跳过搜索空值文件?因为那会导致我的例外情况。
答案 0 :(得分:0)
那么......
你的问题是相当脱节的,我无法理解所有这一切 - 也许这就是你到目前为止没有得到答案的原因。跳过空字段只是在filterFunc1中添加新条件的问题 - if Convert.IsDBNull(item) then continue for
(假设item
是DataRow中的字段,当然)。
然而,这种编程风格非常模糊,我建议至少要清楚过滤哪些列以及列中的对象类型。一种更好的方法是将您从数据库获取的数据映射到应用程序中的实际对象 - 这样可以实现更加类型安全的编程。我认为这里的主要问题是没有人能够从几行代码中真正分辨出发生了什么,因为没有人可以对那里的对象做出任何假设。
关于ComboBox中的项目,不知道你遇到了什么样的困难,你可能想稍微清楚一点。
你可以维护,而不仅仅是字符串,包含标题和ID的结构,比如说
public class YourComboItem
public property Id as string [get/set]
public property Title as string [get/set]
end class
然后将ComboBox的ItemsSource绑定到从数据库中检索的这些项的集合,并将DisplayMemberPath设置为Title
,将ValueMemberPath设置为Id
。然后,您可以使用ComboBox的SelectedValue来获取所选的ID。如您所见,拥有对象而不是原始数据结构可以带来一些优势。
当然,我描述了直接从ComboBox获取SelectedValue,而更好的架构是MVVM,ViewModel包含ObservableCollection(Of YourComboItem)
,ComboBox的ItemSource与实际绑定绑定在一起。然后,您还可以将SelectedItem绑定到ViewModel中的属性,并将项目作为一个整体,包括Id和Title,以便在不了解您的用户界面的情况下使用。或者,您可以从项目集合生成ICollectionView并将ItemsSource绑定到该项目,然后您将在ICollectionView的CurrentItem属性中拥有所选项目。
我真的建议您阅读MVVM(Model-View-ViewModel),以便更轻松地使用WPF。