DataGridフィルタクエリーとレンダラーの使用
以前はフィルタを使用していませんでしたが、クエリーが面倒でarrayCollecton全体を巡回する必要があります.
1.元のデータをバックアップする
2.バックアップからすべてを取り出す
以上の2つの方法は、クエリーの準備をしています.
3.照会
上は番号、名前、会社のあいまいなクエリーです.
次はfilterで行います.
これで簡単です
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>
これで簡単です