现在的位置: 首页 > 综合 > 正文

dataGrid过滤器查询和渲染器的使用

2013年02月20日 ⁄ 综合 ⁄ 共 2476字 ⁄ 字号 评论关闭

以前没用过滤器,查询比较麻烦,需要遍历整个arrayCollecton

1.备份原来的数据

	private var myCt:ArrayCollection = new ArrayCollection();
			private var flag:Boolean = true;
			private function backup():void {
				if(flag) {
					myCt.removeAll();
					for(var i:int=0;i<myArrayCollection.length;i++) {
						var person:Object = myArrayCollection.getItemAt(i);
						myCt.addItem(person);
					}
				}
				flag = false;
			}

2.从备份中取出所有

	private function getAll():void {
				myArrayCollection.removeAll();
				for(var j:int=0;j<myCt.length;j++) {
					var temp:Object = myCt.getItemAt(j);
					myArrayCollection.addItem(temp);
				}
			}

以上两个方法都是为查询做准备的

3.查询

	private function selectInfo(key:String):void {
				//查询之前先备份绑定的ArrayCollection,并清空绑定的ArrayCollection
				backup();
				//遍历备份的数据
				if(key.length != 0) {
					myArrayCollection.removeAll();
					for(var i:int=0;i<myCt.length;i++) {
						var person:Object = myCt.getItemAt(i);
						if((person.num).indexOf(key) != -1 || (person.name).indexOf(key) != -1 || (person.company).indexOf(key) != -1) {
							myArrayCollection.addItem(person);
						} 
					}
					//如果查询结果为空
					if(myArrayCollection.length == 0) {
						Alert.show("没有查询到相关数据,请重新输入关键字查询!");
					}
				} else {
					//输入为空,返回所有数据
					getAll();
				}
				myData.invalidateList();
			}

上面是以对编号,姓名和公司的模糊查询

下面用filter来做:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="init()">
	<fx:Script>
		<![CDATA[
			import mx.collections.ArrayCollection;
			import mx.controls.Alert;
			import mx.controls.CheckBox;
			import mx.core.FlexGlobals;
			import mx.events.FlexEvent;
			[Bindable]
			public var arr:ArrayCollection = new ArrayCollection([
				{name:'jim',num:'001',selected:true},
				{name:'tom',num:'002'},
				{name:'lucy',num:'003'}]);
			
			private function init():void
			{
				dg.dataProvider = arr;
			}
			
			private function textinput1_enterHandler(event:FlexEvent):void
			{
				arr.filterFunction = dgFilter;
				arr.refresh();
			}
			
			private function dgFilter(item:Object):Boolean{
				if(item["name"].toString().indexOf(txt.text)>=0 ){
					return true;
				}else if(item["num"].toString().indexOf(txt.text.toString())>=0 ){
					return true;
				}else{
					return false;
				}
			}
			
			public function a():void{
				Alert.show("hello");
			}
			
		]]>
	</fx:Script>
	<fx:Declarations>
		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
	</fx:Declarations>
	<mx:DataGrid id="dg"  x="166" y="57">
		<mx:columns>
			<mx:DataGridColumn  dataField="selected">
				<mx:itemRenderer>
					<fx:Component>
						<mx:Button label="click me" click="outerDocument.a()"/>
					</fx:Component>
				</mx:itemRenderer>
			</mx:DataGridColumn>
			<mx:DataGridColumn headerText="姓名" dataField="name"/>
			<mx:DataGridColumn headerText="编号" dataField="num"/>
		</mx:columns>
	</mx:DataGrid>
	<s:TextInput id="txt" x="166" y="27" enter="textinput1_enterHandler(event)"/>
</s:Application>

这样就很简单了

抱歉!评论已关闭.