使用FlexGrid > 过滤 > |
C1FlexGrid和“扩展程序集”一起打包发布,这些扩展程序集包括C1.Silverlight.FlexGridFilter 和C1.WPF.FlexGridFilter(在线文档'C1.WPF.FlexGridFilter.4 程序集'),这些程序集提供了Excel样式的过滤功能。为使用这些组件,需要将它们添加到您的工程引用,并创建一个C1FlexGridFilter 对象关联到一个现有的Grid。例如:
C# |
拷贝代码
|
---|---|
// 创建C1FlexGrid var flex = new C1FlexGrid(); // 在Grid上启用过滤 var gridFilter = new C1FlexGridFilter(flex); |
此外,C1.Silverlight.FlexGrid.GroupPanel以及C1.WPF.FlexGrid.GroupPanel (在线文档'C1.WPF.FlexGrid.GroupPanel.4 程序集')程序集同样也做为扩展程序集提供对C1FlexGrid控件的分组管理功能。我们决定使用扩展组件而不是将功能直接添加到控件上的原因有两个:
您同样也可以在Grid声明的XAML文件中启用过滤。这里是实现该功能的语法:
XAML |
拷贝代码
|
---|---|
<c1:C1FlexGrid Name="_flex" > <!-- 向控件添加过滤支持: --> <c1:C1FlexGridFilterService.FlexGridFilter> <c1:C1FlexGridFilter /> </c1:C1FlexGridFilterService.FlexGridFilter> </c1:C1FlexGrid> |
一旦启用了过滤功能,当鼠标悬停在列头上时,Grid会显示一个下拉图标。下拉菜单中显示一个编辑器,允许用户指定如何筛选该列中的数据。用户可选择两种类型的过滤器:
下面的图像显示,当正在进行编辑时,过滤器的外观:
值过滤器:用户通过从列表中选择值创建筛选器。
条件过滤器:用户通过设置一个或两个条件创建过滤器。
对于大多数应用程序,默认的过滤器设置是足够的,但您可以通过几种不同的方法自定义筛选器。
过滤器工作在两种不同的模式下,取决于UseCollectionView属性的设置。
如果您设置UseCollectionView属性的值为false,则不满足过滤条件的行将隐藏(过滤器将设置它们的Visible属性为false)。在这种模式下,过滤器对行计数没有影响。您可以在绑定以及非绑定模式的Grid中使用该模式。
如果您设置了过滤器的UseCollectionView属性值为true,则过滤将应用到数据源(通过ICollectionView.Filter属性)。在这种模式下,对过滤器所做的改变将直接影响数据源暴露给Grid的数据项的个数,与此同时,任何绑定到相同数据源的其他控件将受到影响。您只能在绑定模式使用该模式的过滤器。
例如:
C# |
拷贝代码
|
---|---|
// 创建C1FlexGrid var flex = new C1FlexGrid(); // 在Grid上启用过滤 var gridFilter = new C1FlexGridFilter(flex); // 在数据源级别进行过滤 gridFilter.UseCollectionView = true; |
或者,通过 XAML:
XAML |
拷贝代码
|
---|---|
<c1:C1FlexGrid Name="_flex" > <!-- 向控件添加过滤支持: --> <c1:C1FlexGridFilterService.FlexGridFilter> <c1:C1FlexGridFilter UseCollectionView=”True”/> </c1:C1FlexGridFilterService.FlexGridFilter> </c1:C1FlexGrid> |
默认情况下,每个列将启用过滤器。包含布尔型或者枚举值的数据列将使用一个值过滤器,而包含其他数据值类型的列将可以使用值过滤器或者条件过滤器。
您可以通过FilterType属性改变这一行为并指定在每一列上启用的过滤器类型。
在当列举有大量的相同值或者当列包含无法进行过滤的绑定关系时,指定过滤器类型将非常重要。
例如,包含图像的列不能用值或条件筛选器来过滤。在这种情况下,你可以通过设置FilterType 属性为None禁用过滤器。
一个包含数千个项目的Grid可能具有一个唯一标识符的列,该列添加了过多的项目至值过滤器,这将使得其性能低下,实际上这种过滤通常没有什么实际用途。在这种情况下,通过设置FilterType属性为Condition以禁用值过滤器。
下面的代码演示了如何实现这一点:
C# |
拷贝代码
|
---|---|
// 创建C1FlexGrid var flex = new C1FlexGrid(); // 在Grid上启用过滤 var gridFilter = new C1FlexGridFilter(flex); // 在图像类型的列上禁用过滤 var columnFilter = gridFilter.GetColumnFilter(flex.Columns[“Image”]); columnFilter.FilterType = FilterType.None; // 在标识符列上禁用值过滤器 columnFilter = gridFilter.GetColumnFilter(flex.Columns[“ID”]); columnFilter.FilterType = FilterType.Condition; |
在大多数情况下,用户仅需设置过滤器。但是ColumnFilter类同样也提供了完整的对象模型,允许开发人员通过代码检查以及修改过滤条件。
例如,下面的代码将过滤器应用到第二列。该过滤器将使的Grid显示第二列中的值包含字母Z的项目:
C# |
拷贝代码
|
---|---|
// 创建C1FlexGrid var flex = new C1FlexGrid(); // 在Grid上启用过滤 var gridFilter = new C1FlexGridFilter(flex); // 获取第一列的过滤器 var columnFilter = gridFilter.GetColumnFilter(flex.Columns[0]); // 创建过滤条件(包含字母'Z') var condition = columnFilter.ConditionFilter.Condition1; condition.Operator = ConditionOperator.Contains; condition.Parameter = "Z"; // 应用该过滤器 gridFilter.Apply(); |
C1FlexGridFilter类包含一个FilterDefinition属性,该属性可以以XML字符串形式获取或设置当前的过滤器状态。当用户退出应用程序时,可以使用该字符串来保持该过滤器状态,这样您可以稍后还原。
您也可以保存几个过滤器的定义,允许用户选择并自定义这些预设过滤器。您还可以通过SaveFilterDefinition 以及 LoadFilterDefinition方法保存和恢复过滤器的定义。