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

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

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

高级过滤器

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>

全文过滤

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" Width="177" />

多值过滤

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添加高级过滤功能的最简单方法。

第二种方法会灵活一些。你可以将高级过滤功能关闭,直接在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>

多条件过滤

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

就像上面的多值过滤一样,你可以在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>

组合过滤

通过组合过滤,用户可以一次设置多种类型的过滤条件。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>

为模板列添加过滤功能

模板列不支持缺省的过滤功能,但可以通过设置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 => o);
}

  

用户自定义过滤器

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

关于更多的功能可以下载C1DataGrid产品,Studio for Silverlight或Studio for WPF。

很高兴能和大家分享 ComponentOne 的使用方法、讨论 ComponentOne 使用过程中遇到的问题。

葡萄城控件产品网站:http://www.gcpowertools.com.cn/ 
      葡萄城技术支持论坛:http://gcdn.grapecity.com/

转载于:https://www.cnblogs.com/C1SupportTeam/archive/2012/08/10/2632283.html

深入解析 DataGrid 过滤功能相关推荐

  1. 基于交换芯片的五元组的PCL规则过滤功能

    2019独角兽企业重金招聘Python工程师标准>>> 基于交换芯片的五元组的PCL规则过滤功能作者: 韩大卫@吉林师范大学2012.12.10Not Approved by Doc ...

  2. 完爆Facebook/GraphQL,APIJSON全方位对比解析(一)-基础功能

    相关阅读: 完爆Facebook/GraphQL,APIJSON全方位对比解析(二)-权限控制 完爆Facebook/GraphQL,APIJSON全方位对比解析(三)-表关联查询 自APIJSON发 ...

  3. 过滤功能失效 Google Base成“虚拟×××”

    本周早些时候,一个技术性缺陷使得Google新推出的Google Base 临时成为了一个巨大的虚拟×××. 上周推出的Google Base 标志着Google介入了免费个人分类广告和用户创建内容领 ...

  4. html 表格过滤功能,简单的带排序和过滤功能的jQuery表格插件

    smart-table是一款简单实用的带排序和过滤功能的jQuery表格插件.该jQuery表格插件通过简单的设置就可以生成表格排序.表格字段过滤功能,甚至可以实现表格分页显示,使用非常方便. 使用方 ...

  5. java实现筛选_教你用Java web实现多条件过滤功能

    生活中,当你闲暇之余浏览资讯的时候,当你搜索资料但繁杂信息夹杂时候,你就会想,如何更为准确的定位需求信息.今天就为你带来: 分页查询 需求分析:在列表页面中,显示指定条数的数据,通过翻页按钮完成首页/ ...

  6. Guava中针对集合的 filter和过滤功能

    Guava中针对集合的 filter和过滤功能 博客分类:  JAVA相关 在guava库中,自带了过滤器(filter)的功能,可以用来对collection 进行过滤,先看例子: Java代码   ...

  7. ALV标准过滤功能失效

    1, 问题描述 ALV显示时,使用标准的ALV工具栏上的过滤功能,发现不起作用,如下,对Change Indicator列过滤失效,不能正确显示过滤结果. 2, 问题解决 失效的原因其实就是,alv中 ...

  8. SpringCloud-使用路由网关的服务过滤功能-拦截登录前是否有token为例

    场景 SpringCloud-使用路由网关统一访问接口(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102733 ...

  9. 使用layer7应用层过滤功能

    默认 netfilter/iptables 体系的不足,以基于网络层的数据包过滤机制为主,同时提供少量的传输层.数据链路层的过滤功能,难以判断数据包对应于何种应用程序(如QQ.迅雷),通过为Linux ...

最新文章

  1. 清华姚班系初创公司获B轮融资5亿,姚期智「百万富翁」设想已从理论走向应用...
  2. 开源可视化分析工具,操作简单使用方便,快来种草
  3. JVM 的内存结构和内存分配
  4. 在VS2010下运行Qt程序
  5. mac终端mysql的字符集_mac下修改mysql默认字符集为utf8
  6. [Unity3d]u3d中定时器的使用
  7. labview创建.netdll设置多个输出_手把手以实例教你学LabVIEW编程,条件结构编程方法...
  8. c语言中,x-y,'105',ab,7f8那个是正确的,C语言程序设计_第三章 数据.ppt
  9. [转载] python不允许使用关键字_Python中关键字global与nonlocal的区别
  10. WPF整理-使用ResourceDictionary管理Logical Resources
  11. 关于清除贴图与光域网路径
  12. 磁带非但没被淘汰,容量还比硬盘大了???
  13. 智能网联汽车——传感器与驾驶辅助
  14. antd使用g2plot统计图表(7)
  15. ERP系统对企业的作用
  16. java winhex_winhex模版
  17. html pdf支持css%写法吗,flying-saucer-pdf终于完美解决了(中文问题,换行问题,分页,页眉页脚,水印),html+css控制pdf样式...
  18. 基于Mui与H5+开发webapp的Android原生工程打包步骤(使用新版本5+SDK与Android studio)(部分内容转自dcloud官网)...
  19. 【计算机网络】网络分层:五层或七层因特网协议栈
  20. xshell 安装JDK 步骤

热门文章

  1. linux 隐藏进程,linux下如何隐藏进程(ps/top)
  2. Android Studio编程技巧
  3. 在html页面中写验证码图片不显示,freemarker页面实现验证码图片不刷新问题求助_html/css_WEB-ITnose...
  4. 自动驾驶企业Mobileye估值坍塌:降至160亿美元 路演PPT曝光
  5. 17、Java 的基类(Object 类)的方法介绍
  6. PHPSpreadsheet学习笔记——访问单元格
  7. windows defender红叉解决方法
  8. 删除磁盘上的表空间后再删除数据库中的表空间——ORA-01549:表空间非空,请使用including contents选项
  9. 考研英语小程序哪个好用?
  10. Google 各国地址