在DataGrid中实现多条件筛选和搜索
其实,对DatatGrid进行筛选,本质是对DataGrid的dataProvider进行筛选。筛选功能通过ICollectionView接口的filterFunction属性实现。
通常,DataGrid的dataProvider会是一个ArrayCollection,而ArrayCollection实现了ICollectionView接口,因此可以直接使用filterFunction属性。
因此,要实现对一个ArrayCollection的筛选,只需要把一个自定义函数名指定给这个要被筛选的ArrayCollection的filterFunction属性,然后刷新ArrayCollection即可,例如:
1cityAC.filterFunction = filterFunc;
2cityAC.refresh();
在这里例子里面,我使用的数据是武汉市和宜昌市的下级行政区。可以使用三种条件进行筛选:
- 显示武汉市、宜昌市、或者全部的行政区
- 显示区、县或者县级市
- 根据名称或者名称的拼音进行筛选
所以,这个自定义函数就是筛选功能实现的核心:
1private function filterFunc(item:Object):Boolean
2{
3 var _csv:int = citySelectCOB.selectedItem.data; //csv = citySelectValue
4 var _lsv:String = levelSelectCOB.selectedLabel; //lsv = levelSelectValue
5 var _sv:String = searchTI.text; //sv - seachValue
6 var _lre:RegExp = new RegExp(_lsv, "");
7 var _sre:RegExp = new RegExp(_sv, "gi");
8 var _cb:Boolean = (_csv == -1) ? true : (item.parent == _csv);
9 var _lb:Boolean = (_lsv == "全部") ? true : _lre.test(item.label);
10 var _sb:Boolean = (_sv == "") ? true : (_sre.test(item.label) || _sre.test(item.data));
11 trace("_sv:", _sv)
12 trace("_sre.test(item.label):", _sre.test(item.data));
13 trace("item.label:", item.data);
14 return _cb && _lb && _sb;
15}
filterFunc这个函数的参数就是ArrayCollection的一项,通过在判断相应项目的值,返回true的项目会显示,返回false的项目则不会显示在DataGrid中。由于是多种条件,因此在函数中进行了三重判断,最后对三重判断的结果进行 与 操作或者最终判断值。
范例效果:
- 文章ID:349
- 原文作者:zrong
- 原文链接:https://blog.zengrong.net/post/datagrid-filter/
- 版权声明:本作品采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可,非商业转载请注明出处(原文作者,原文链接),商业转载请联系作者获得授权。