DataGridフィルタクエリーとレンダラーの使用


以前はフィルタを使用していませんでしたが、クエリーが面倒で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);
				}
			}

以上の2つの方法は、クエリーの準備をしています.
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>

これで簡単です