DataTable上的过滤方法:
一、可以用DataTable.Select("条件"),返回DataRow[]格式的结果集。
DataRow[] drArr = dt.Select("C1 LIKE ’abc%’");//模糊查询
想要在网格上看到过滤后的效果,则还需要进一步转换:
先看一个错误的写法:
DataTable dtNew = dt.Clone(); for (int i = 0; i < drArr.Length; i++) { dtNew.Rows.Add(drArr[i]); }
上面的写法会报错,因为DataRow是属于其他DataTable的(这个和我们复制一个XmlNode时是一个道理,不能直接取出一个xmlNode的子节点,然后另外一个节点用Append(node)方法将其添加进来,此时会报相同的错误,提示该节点是属于另外一个xmlNode节点的)。正确的写法如下:
DataTable dtNew = dt.Clone(); for (int i = 0; i < drArr.Length; i++) { dtNew.ImportRow(drArr[i]); }
要用Import的方式,同理,如果是将一个xmlNode复制到另一个xmlNode的子下面去时,也应该用Node.ImportNode()方法。
得到了过滤后的数据源后,将其绑定到当前网格即可。但是这种方法也有它的弊端,此时网格的数据源已经改变了!如果再要求有一个取消过滤的功能,那么如果不事先保存原来的数据源,便不能再回到初始状态。
二、DataTable.DefaultView.RowFilter="过滤条件"
DataTable.DefaultView是DataTable的一个视图。在博客园中曾经参考了博客http://www.cnblogs.com/spirithero/archive/2011/07/20/2111351.html
其中将Default的用法讲的很详细。
前段时间在项目中遇到了一个DataTable过滤区分大小写的问题,我把原来的界面做了一个比较丑,比较简陋的界面,但是功能都有了。具体的界面如下:
可以用DataTable的CaseSensitive属性来设置其是否大小写敏感,但是这个会对整个网格都生效,例如以上这个例子中,有的过滤条件是大小写敏感的而有的条件又是不敏感的。
后来的解决方法如下:
var dt=(DataTable)DataGridViewFilter.DataSource; dt.CaseSensitive=true; var dv=dt.DefaultView;
var upperChar='b'.ToUpper();//获取不区分大小写的行,将这一行的值分别转化为大写和小写的
var lowerChar='b'.ToLower(); dv.RowFilter=('CID like '%a%'' and (CNAME='upperChar' || CNAME='lowerChar') or CCLASS like '%C%');
当哪一行是大小写不敏感时,就对这一行进行特殊考虑,把大写和小写都考虑进去,用or连接。然后拼成sql串。
注意:dv.RowFilter="UPPER(CNAME) like '%A%'"是不支持的。即在RowFilter中不支持大小写的转换,只能写过滤语句。不能有其他的函数。