深入解析 DataGrid 过滤功能

简介:

过滤是DataGrid这样的表格控件的基本功能之一,也是非常重要的特性。微软提供的标准DataGrid相信大家都很熟悉了。本文要解析的不是标准DataGrid,而是Silverlight和WPF平台下的C1DataGrid的过滤功能。经过多年的打磨,最新的ComponentOne 2011 v3版中的C1DataGrid已经具有了很多不同以往的过滤技术,每一种都很容易使用而且功能强大。这里将会展示几个例子和效果图,希望对大家有用。

 

默认过滤

把一个IEnumerable数据源绑定到C1DataGrid上,设置CanUserFilter为true,就可以看到默认条件下的过滤结果。过滤器会根据用户输入的条件,列出过滤结果,比如“大于10”或者“包含R”。

DefaultFilter

 

根据不同列的数据类型,C1DataGrid还提供了特殊的过滤器。比如日期类型或者布尔类型的列中,可以选择适合的条件过滤器,如下图所示:

CheckBoxFilter

 

高级过滤器

C1.Silverlight.DataGrid.Filters.dll中提供了很多高级的过滤功能。这样做的好处是,如果你需要这些高级特性,那么就添加该dll到项目里。如果不需要,那它不会对项目的size造成影响。

 

行过滤

另外一种基本的过滤功能可通过典型的过滤行来实现。过滤行是由一些文本框组成的固定行,用户可以在改行的文本框中输入过滤条件。在C1DataGrid中可以通过TopRows或BottomRows非常便捷的实现行过滤功能,只需为其添加一个DataGridFilterRow类型的元素(请确保你添加了C1.Sliverlight.DataGrid.Filters程序集的引用),然后设置固定行数即可。

<c1:C1DataGrid Name="c1DataGrid1" CanUserFilter="True" FrozenTopRowsCount="1"

RowHeight="30">

<c1:C1DataGrid.TopRows>

<c1:DataGridFilterRow />

</c1:C1DataGrid.TopRows>

</c1:C1DataGrid>

clip_image002

全文过滤

C1DataGrid提供了对整个Grid中文本进行过滤的功能,用户可一次性完成所有列的检索或过滤操作。而这一切,只需为FullTextSearchBehavior属性绑定一个控件,例如:TextBox控件,它就会为你自动完成剩下的工作。

<c1:C1DataGrid Name="c1DataGrid1" CanUserFilter="True" Margin="0,27,0,0">

<c1:C1FullTextSearchBehavior.FullTextSearchBehavior>

<c1:C1FullTextSearchBehavior Filter="{Binding ElementName=textBox1, Path=Text}" />

</c1:C1FullTextSearchBehavior.FullTextSearchBehavior>

</c1:C1DataGrid>

<TextBox Height="23" HorizontalAlignment="Left" Name="textBox1" VerticalAlignment="Top" ;177" />

clip_image004

多值过滤

C1DataGrid提供了类似于Excel那样的多值过滤功能。可作为过滤条件的值以选择列表的形式显示,用户可以选择那些值显示,那些不显示,这为拥有唯一或者重复值的列提供了非常有效的过滤方式(例如:类别或类型列)。你可以通过两种方法实现多值过滤功能。

第一种方法是利用C1DataGrid内置的高级过滤特性。只需为Grid添加 一个C1AdvancedFiltersBehavior类,这样就为Grid添加了内置的高级过滤功能,包括多值过滤。

<c1:C1DataGrid Name="c1DataGrid1" AutoGenerateColumns="False" CanUserFilter="True" CanUserAddRows="False" RowHeight="30">

<!—设置高级过滤器-->

<c1:C1AdvancedFiltersBehavior.AdvancedFiltersBehavior>

<c1:C1AdvancedFiltersBehavior />

</c1:C1AdvancedFiltersBehavior.AdvancedFiltersBehavior>

</c1:C1DataGrid>

通过C1AdvancedFiltersBehavior为Grid中的列添加了简单过滤和多值过滤功能,这并没有使用太多的控件,是为整个Grid添加高级过滤功能的最简单方法。

clip_image006

第二种方法会灵活一些。你可以将高级过滤功能关闭,直接在XAML或代码中为每一列指定特殊的过滤类型,下面演示如何为某一列添加多值过滤功能:

<c1:C1DataGrid Name="c1DataGrid1" ItemsSource="{Binding Flavors}" AutoGenerateColumns="False" CanUserFilter="True">

<c1:C1DataGrid.Columns>

<c1:DataGridTextColumn Header="Flavor" Binding="{Binding FlavorName}" FilterMemberPath="FlavorName">

<!—添加多值过滤器-->

<c1:DataGridTextColumn.Filter>

<c1:DataGridContentFilter >

<c1:DataGridMultiValueFilter ItemsSource="{Binding Flavors}" DisplayMemberPath="FlavorName" ValueMemberPath="FlavorName" MaxHeight="200"/>

</c1:DataGridContentFilter>

</c1:DataGridTextColumn.Filter>

</c1:DataGridTextColumn>

<!—其它列信息-->

<c1:DataGridCheckBoxColumn Header="Has Nuts" Binding="{Binding IncludesNuts}" FilterMemberPath="IncludesNuts" />

<c1:DataGridTextColumn Header="Percent" Format="p1" Binding="{Binding Percent}" FilterMemberPath="Percent"/>

</c1:C1DataGrid.Columns>

</c1:C1DataGrid>

需要注意的是,上面的方法是为多值过滤器指定ItemsSource来实现的。

clip_image008

多条件过滤

多条件过滤是对缺省过滤的一种扩展,你可以一次设置多个过滤条件,过滤条件的个数没有限制,可根据用户的需求设置相应的数量。

就像上面的多值过滤一样,你可以在XAML中通过设置Filter属性来定制过滤功能。例如,你可以为Text类型的列添加C1MultiLineTextFilter来实现多条件过滤功能(也可以为DateTime和Numeric类型的列设置多条件过滤)。

<c1:C1DataGrid Name="c1DataGrid1" AutoGenerateColumns="False" CanUserFilter="True">

<c1:C1DataGrid.Columns>

<c1:DataGridTextColumn Header="Flavor" Binding="{Binding FlavorName}" FilterMemberPath="FlavorName">

<!—添加条件过滤器-->

<c1:DataGridTextColumn.Filter>

<c1:DataGridContentFilter >

<c1:DataGridMultiLineTextFilter />

</c1:DataGridContentFilter>

</c1:DataGridTextColumn.Filter>

</c1:DataGridTextColumn>

<!—添加其它列 -->

...

</c1:C1DataGrid.Columns>

</c1:C1DataGrid>

clip_image010

组合过滤

通过组合过滤,用户可以一次设置多种类型的过滤条件。C1DataGrid本身支持多种类型的过滤器,你可以使用DataGridFilterList为每列添加多种类型的过滤器。

例如,你想同时使用文本和数字过滤器,就可以通过下面的代码来实现:

<c1:C1DataGrid Name="c1DataGrid1" ItemsSource="{Binding Flavors}" AutoGenerateColumns="False" CanUserFilter="True">

<c1:C1DataGrid.Columns>

<c1:DataGridTextColumn Header="Flavor" Binding="{Binding FlavorName}" FilterMemberPath="FlavorName" />

<c1:DataGridCheckBoxColumn Header="Has Nuts" Binding="{Binding IncludesNuts}" FilterMemberPath="IncludesNuts" />

<c1:DataGridTextColumn Header="Percent" Format="p1" Binding="{Binding Percent}" FilterMemberPath="Percent">

<c1:DataGridTextColumn.Filter>

<c1:DataGridContentFilter >

<c1:DataGridFilterList>

<c1:DataGridTextFilter />

<c1:DataGridNumericFilter Format="p1" />

</c1:DataGridFilterList>

</c1:DataGridContentFilter>

</c1:DataGridTextColumn.Filter>

</c1:DataGridTextColumn>

</c1:C1DataGrid.Columns>

</c1:C1DataGrid>

clip_image012

为模板列添加过滤功能

模板列不支持缺省的过滤功能,但可以通过设置Filter属性来定制过滤功能。例如,通过下面的代码可以为模板列添加一个多值过滤功能:

<c1:C1DataGrid Name="c1DataGrid1" ItemsSource="{Binding Flavors}" AutoGenerateColumns="False" CanUserFilter="True">

<c1:C1DataGrid.Columns>

<!—添加模板列-->

<c1:DataGridTemplateColumn Header="Flavor" FilterMemberPath="FlavorName">

<c1:DataGridTemplateColumn.CellTemplate>

<DataTemplate>

<TextBlock Text="{Binding FlavorName}" />

</DataTemplate>

</c1:DataGridTemplateColumn.CellTemplate>

<!—添加多值过滤器-->

<c1:DataGridTemplateColumn.Filter>

<c1:DataGridContentFilter >

<c1:DataGridMultiValueFilter ItemsSource="{Binding Flavors}" MaxHeight="200" DisplayMemberPath="FlavorName" ValueMemberPath="FlavorName" />

</c1:DataGridContentFilter>

</c1:DataGridTemplateColumn.Filter>

</c1:DataGridTemplateColumn>

<!—添加其它列-->

...

</c1:C1DataGrid.Columns>

</c1:C1DataGrid>

通过代码设置过滤功能

有些情况下,需要在代码中控制过滤功能,C1DataGrid为此提供了两个非常重要的事件。FilterLoading在每列的过滤器加载后触发,你可以在这个事件中设置自定义的过滤器。FilterOpened在过滤器被打开之后触发,此时可以动态设置一些选项的值。

下面演示如何使用代码设置一个多值过滤器:

private void dataGrid_FilterLoading(object sender, DataGridColumnEditableValueEventArgs<IDataGridFilter> e)

{

var column = e.Column;

var multiValueFilter = new DataGridMultiValueFilter();

(e.Value as DataGridFilter).InnerControl = multiValueFilter;

}

下面演示如何使用代码为多值列表设置数据:

void dataGrid_FilterOpened(object sender, DataGridColumnValueEventArgs<IDataGridFilter> e)

{

var boundColumn = e.Column as DataGridBoundColumn;

if (boundColumn == null)

return;

// 创建并设置多值过滤器

var filterControl = (DataGridMultiValueFilter)((DataGridFilter)e.Value).InnerControl;

filterControl.ItemsSource = items.Select(selector).Distinct().OrderBy(o =&gt; o);

}

用户自定义过滤器

C1DataGrid的过滤功能不局限于上面提到的几种方式,你可以实现你需要的自定义过滤器,然后将这个过滤器设置给特定的列。根据数据的不同,你可以设置一个树形结构、直方图或者日历形式的过滤器,你可以在C1DataGrid的例子中找到相应的实现。



本文转自 powertoolsteam 51CTO博客,原文链接:http://blog.51cto.com/powertoolsteam/738044,如需转载请自行联系原作者

相关文章
|
25天前
|
数据可视化 搜索推荐 BI
深度解析好用项目管理工具的功能优势
在选择项目管理工具时,重点在于全面的功能和高性价比。好工具应具备资源利用图(避免过度分配或闲置资源),团队协作功能(促进沟通与进度追踪),质量管理(如问题跟踪和自定义工作流),项目规划和跟踪(甘特图支持),任务管理(任务分解和依赖关系),以及费用跟踪。Zoho Projects、Microsoft Project、Jira等工具各有价格差异,例如,对于50个用户,Microsoft Project最贵,Zoho Projects最实惠,性价比高,适合中小企业。
29 2
|
1月前
|
UED 开发者
通义千问新增文档解析功能,可处理超万页文档
【2月更文挑战第25天】通义千问新增文档解析功能,可处理超万页文档
115 6
通义千问新增文档解析功能,可处理超万页文档
|
1月前
|
缓存 前端开发 Java
【二十八】springboot之通过threadLocal+参数解析器实现同session一样保存当前登录信息的功能
【二十八】springboot之通过threadLocal+参数解析器实现同session一样保存当前登录信息的功能
32 1
|
2天前
|
JSON 前端开发 Java
Javaweb之SpringBootWeb案例之异常处理功能的详细解析
Javaweb之SpringBootWeb案例之异常处理功能的详细解析
14 0
|
2天前
|
存储 前端开发 Java
Javaweb之SpringBootWeb案例之登录校验功能的详细解析
Javaweb之SpringBootWeb案例之登录校验功能的详细解析
5 0
|
1月前
|
人工智能 运维 搜索推荐
精准选型!企业CRM系统选型指南携手十大功能解析
# CRM系统十大功能概览 CRM系统超越了基本的数据库和商机管理,涵盖线索管理、销售自动化、联系人和客户管理、工作流自动化、营销自动化及AI人工智能助手。它优化销售流程,自动化重复任务,支持客户细分,线索培育,市场活动管理和销售预测。AI功能提供销售预测和异常检测,助力企业提升效率和洞悉市场趋势。此指南为企业选型CRM系统提供参考。
19 1
精准选型!企业CRM系统选型指南携手十大功能解析
|
1月前
|
安全 芯片
OVP过压保护芯片:为何电子工程师需要它?功能、作用全解析
OVP过压保护芯片:为何电子工程师需要它?功能、作用全解析
|
1月前
|
负载均衡 算法 Java
SpringCloud负载均衡源码解析 | 带你从表层一步步剖析Ribbon组件如何实现负载均衡功能
SpringCloud负载均衡源码解析 | 带你从表层一步步剖析Ribbon组件如何实现负载均衡功能
|
1月前
|
小程序
TDesign电商小程序模板解析02-首页功能
TDesign电商小程序模板解析02-首页功能
|
2月前
|
数据挖掘 API 数据处理
获取商品详情信息API接口:1688开放平台功能解析
首先,要获取商品详情信息,开发者需要向1688开放平台申请相应的权限,并遵循其调用规则。在调用商品详情信息API接口时,需要传入相应的请求参数,如商品ID、调用时间戳、密钥等。这些参数对于确保接口的正常运行至关重要。

推荐镜像

更多