DevExpress WPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件的衍伸产品,还是以数据为中心的商业智能产品,都能通过DevExpress WPF控件来实现。
接下来将介绍如何解决DevExpress GridControl中排序和过滤操作最常见的问题。
获取DevExpress v24.1正式版下载(Q技术交流:532598169)
排序和过滤不起作用
如果在DevExpress GridControl中排序或过滤不起作用,请检查以下可能导致的原因。
GridColumn绑定到一个复杂对象
问题
DevExpress WPF GridControl可以对支持比较操作符的类型进行排序和过滤,这意味着支持在网格单元格中显示的大多数类型,一些示例是int, string, DateTime和decimal。
另一方面,DevExpress GridControl不能比较复杂的或自定义类型(如MyClass),除非您覆盖该类型的比较操作符。
解决方案
使用以下解决方案当中的一个:
- 将列绑定到复杂类型的嵌套属性。
在ColumnBase.FieldName中使用点来指定单个嵌套属性的复杂路径:
XAML
<dxg:GridColumn FieldName="Customer.Name"/>
使用Bands在一个标题下显示多个嵌套属性。
- 如果您不想绑定列到嵌套属性,实现IComparable接口和ToString()方法。
GridColumn绑定到一个集合
问题
DevExpress GridControl不能比较集合,对绑定到集合类型的列禁用排序。
解决方案
确保列绑定到数据源字段。
使用以下解决方案当中的一个:
- 启用按显示文本排序和过滤,设置ColumnBase.ColumnFilterMode和ColumnBase.SortMode属性为DisplayText。要在单元格中显示一个集合,使用CheckedComboBoxStyleSettings将目标GridColumn的EditSettings设置为ComboBoxEditSettings。
如果通过显示文本启用筛选器,则自动筛选器行可以与集合绑定列一起工作,使用Contains条件按单独的单词筛选值。 - 使用GridControl.SubstituteFilter事件更新网格过滤器。
使用GridColumnBinding且第一行的Bound属性为Null
问题
如果列使用ColumnBase.Binding属性获取数据,DevExpress GridControl将检查第一行以确定属性类型。如果第一行中的字段值为空,则DevExpress GridControl无法生成属性描述符。
如果列使用ColumnBase.FieldName属性并且绑定的属性类型是object,则可能出现类似的问题。
解决方案
要让DevExpress GridControl知道实际的列类型,可以设置ColumnBase.UnboundDataType属性。如果使用ColumnBase.FieldName属性绑定列,请使用绑定,然后设置UnboundDataType。
XAML
xmlns:sys="clr-namespace:System;assembly=mscorlib"
<dxg:GridColumn Binding="{Binding SomeProperty, Mode=TwoWay}" UnboundDataType="{x:Type sys:String}"/>
服务器模式与未绑定列一起使用
问题
使用GridControl.CustomUnboundColumnData或GridControl.CustomUnboundColumnDataCommand填充值的未绑定列不能在服务器模式下排序或过滤。
解决方案
使用ColumnBase.UnboundExpression属性填充列。
注意 :使用ColumnBase.Binding属性填充的列将作为未绑定处理,因为绑定可以包含自定义转换器。
使用虚拟资源
问题
如果使用虚拟源,则排序和过滤不起作用。
解决方案
要在虚拟源中启用排序和过滤,请按照下面帮助主题中描述的步骤操作:
数值按字符串排序/过滤
问题
DevExpress GridControl将数值作为字符串进行排序和过滤,发生此操作是因为ColumnBase.ColumnFilterMode被设置为DisplayText。
解决方案
将ColumnBase.ColumnFilterMode设置为Value。