我正在使用我在网上找到的过滤器设置,我在使用三个组件 - comboBox,复选框和文本输入过滤我的mx:DataGrid时遇到问题。复选框和comboBox与我的IFilter接口和Filter类正常工作,但我无法使搜索输入正常工作。以下是源文件中的代码
package com.daveoncode.filters {
//Defines a common interface that must be implemented by all the filters.
public interface IFilter {
function apply(item:Object):Boolean;
}
}
package com.daveoncode.filters {
// The only purpose of Filter is to be wrapped by one or more filters (classes which extend AbstractFilter)
public class Filter implements IFilter {
// A wildcard which means "all values are accepted"
public static const ALL_VALUES:String = "*";
public function Filter() {
}
// This is a basic implementation of IFilter interface, the value returned is always true and only apply()
// methods implemented by subclasses of AbstractFilter have real buisiness logic implementation
//@return Boolean <p>Always true</p>
public function apply(item:Object):Boolean {
return true;
}
}
}
package com.daveoncode.filters {
public class SearchFilter extends AbstractFilterDecorator {
// @param target IFilter <p>A reference to a wrapped IFilter object</p>
// @param value Object <p>Value against which the filter is applied</p>
public function SearchFilter(target:IFilter, value:Object) {
super(target, value);
}
// Impl of IFilter int by overr the dummy apply() of AbstractFilterDecorator
override public function apply(item:Object):Boolean {
return this._target.apply(item) && (this._value == item.Package || this._value == Filter.ALL_VALUES);
}
}
}
&#13;
我正在尝试使用下面的applyFilterRefresh()过滤器功能来使用搜索功能。目前它确实搜索DataGrid,但它只过滤区分大小写的完全匹配。我想在每次击球后过滤它。
private function applyFiltersRefresh():void {
var data:ArrayCollection = ArrayCollection(sourceData);
var filter:IFilter = new Filter();
//combo box filtering - works great!
filter = new FacilityTypeFilter(filter, facilityFilter.value);
filter = new BedRangeFilter(filter, bedFilter.value);
//checkbox filtering – works great!
if (hideHealthcareVar == "Healthcare"){
filter = new HideHealthcareFilter(filter, hideHealthcareVar.valueOf());
}
//Search box filtering – needs
if (search.text.length > 0){
var tempSearch:String = search.text;
filter = new HideHealthcareFilter(filter, tempSearch);
}
data.filterFunction = filter.apply;
data.refresh();
}
&#13;
我能够以这种方式过滤我的数据网格(按每个键击和非区分大小写),但因为那时过滤器最终会相互覆盖,而不是同时执行这两个操作。这就是为什么我试图将它包含在我的ApplyFiltersRefresh()函数中。对于冗长的帖子感到抱歉,并提前感谢您的帮助!!
private function budgetGrid_filterFunc(item:Object):Boolean {
if (search.text.length == 0) return true;
var f:String = "ig";
var packageSearch:RegExp = new RegExp(search.text, f);
var packageMatch:Boolean = packageSearch.test(item.Package);
var itemSearch:RegExp = new RegExp(search.text, f);
var itemMatch:Boolean = itemSearch.test(item.ItemNum);
var descriptionSearch:RegExp = new RegExp(search.text, f);
var descriptionMatch:Boolean = descriptionSearch.test(item.ItemDescription);
return (packageMatch || itemMatch || descriptionMatch);
}
private function searchInput_change():void {
if (search.text.length == 0) {
budgetGrid.dataProvider.filterFunction = null;
} else {
budgetGrid.dataProvider.filterFunction = budgetGrid_filterFunc;
}
budgetGrid.dataProvider.refresh();
}
&#13;
答案 0 :(得分:0)
DataSet_SelectForProject