Flex - 按文本输入搜索/过滤DataGrid

时间:2015-05-04 20:22:14

标签: actionscript-3 flex datagrid filtering textinput

我正在使用我在网上找到的过滤器设置,我在使用三个组件 - 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;
&#13;
&#13;

我正在尝试使用下面的applyFilterRefresh()过滤器功能来使用搜索功能。目前它确实搜索DataGrid,但它只过滤区分大小写的完全匹配。我想在每次击球后过滤它。

&#13;
&#13;
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;
&#13;
&#13;

我能够以这种方式过滤我的数据网格(按每个键击和非区分大小写),但因为那时过滤器最终会相互覆盖,而不是同时执行这两个操作。这就是为什么我试图将它包含在我的ApplyFiltersRefresh()函数中。对于冗长的帖子感到抱歉,并提前感谢您的帮助!!

&#13;
&#13;
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;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

DataSet_SelectForProject