【问题标题】:Problem with filtering DataGrid过滤 DataGrid 的问题
【发布时间】:2010-09-15 13:54:01
【问题描述】:

我已将我的 DataGrid 绑定到一个 DataTable,并且只有少数详细信息显示在网格中。当我想过滤 DataGrid 时,我使用 DataGrid 的 ItemsSource 创建了一个视图。 代码:

  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 分开加载。现在我无法将它们包含在搜索中。

我的应用截图:

那么我如何进行仅包含来自已显示部分的文本的搜索。

编辑:另外,我如何跳过搜索空值文件?因为那在我的情况下导致异常。

【问题讨论】:

    标签: wpf datagrid filter


    【解决方案1】:

    那么... 您的问题非常脱节,我无法全部理解-也许这就是您到目前为止没有得到答案的原因。跳过空字段只需在 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 更轻松。

    【讨论】:

    • 嗨,亚历克斯,感谢您的回复。首先,DBNull 的错误在于For Each。它不能将 DBNull 转换为字符串。我究竟应该把转换语法放在哪里?其次,我没有强制按列搜索,而是强制按网格搜索。正如你所说,这可能是一个不好的做法。我会改的!。为什么你说我应该只检索我将要使用的字段?对于组合框,我用来创建过滤器视图的主表没有直接的值,而是它们的 id。说状态ID。现在我无法使用我拥有的视图搜索组合框。
    • 使用 Linq,你可以说 for each item in obj.Row.ItemArray.OfType(String)()(这不是我的想法,所以不确定语法是否正确,很久没有在 VB 中工作了)。此外,全网格搜索应该很明显,是的;在这种情况下,您的方法并不是那么糟糕,我抱怨的是直接针对 DataTable 搜索...这限制了可扩展性等。至于 ComboBox,除了保留标题和 ID 之外,您别无选择搜索时加载元素并获取 ID;我会用建议更新我的答案。
    • 你建议的技术和我的差不多。我没有使用类,而是使用具有 Id 和 Status 名称字段的 DataTable。我的 DataGridComboBox 与链接的 statusId(来自主表)绑定了 this 源。但我的问题是,我的过滤器函数在 主表(视图)上执行搜索,它没有实际值(比如中、低)但 id's(3,6)。如果你愿意,我会在这里发布我的表格结构。我是.Net Alex 的新手。我还没有开始阅读 MVVM。当然会:)
    猜你喜欢
    • 2018-05-08
    • 2014-10-22
    • 2011-02-12
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    相关资源
    最近更新 更多