根据用户输入的关键字,在Tree控件中快速的把匹配的数据列出来是个比较好功能。现在发现有两种实现方法,一是如果Tree数据源是ArrayCollection 可以用它的filterFunction来指定一个过滤函数来实现,二是从Tree的初始数据中过滤出新的XML数据。下面的例子用的就是第二种方法,只列出关键语句? 从webservice获取xml数据方面的操作都不列出了。
private var xmllist:XMLList;
private var keyword:String;
//过滤数据
??? public function filterData(keywodr:String):void
??? {
??????? if(StringUtil.trim(keywodr)!="")
??????? {
??????? this.keyword=keywodr;
??????? var myxml:XML=<node/>;
??????? for(var k:int=0;k<xmllist.length();k++)
??????? {
??????????? var tempxml:XML=getXML(new XMLList(xmllist[k]));
??????????? if(tempxml.children().length()>0)
??????????? {
??????????????? myxml.appendChild(tempxml);
??????????? }
??????? }
??????? this.tree.dataProvider=myxml.children();
??????? }
??????? else????????????? //输入关键字为空时为原始数据
??????? {
??????????? this.tree.dataProvider=xmllist;
??????? }
??? }
?
??? private function getXML(xmllist:XMLList):XML
??? {
??????? var xmlChildren:XMLList=xmllist.children();??????? //子节点
??????? var xml:XML=<categories/>;??????????????????????????? //返回的xml
??????? if(xmllist.hasOwnProperty("@cd")) xml.@cd=xmllist.@cd;//xml属性
??????? if(xmllist.hasOwnProperty("@STNM")) xml.@STNM=xmllist.@STNM;
??????? for(var i:int=0;i<xmlChildren.length();i++)
??????? {
??????????? if(xmlChildren[i].children().length()>0)???????????????????? //有子节点时
??????????? {
??????????????? var xmlGet:XML=getXML(new XMLList(xmlChildren[i]));??????? //递归得到的xml
??????????????? if(xmlGet.children().length()>0)??????????????????????? //有子节点就增加
??????????????? {
??????????????????? xml.appendChild(xmlGet);???????????????????????
??????????????? }
??????????? }else??????????????????????????????????????????????????????? //无子节点时
??????????? {
??????????????? var temp:String=xmlChildren[i].@STNM;
??????????????? if(temp.indexOf(this.keyword)>=0)//关键字
??????????????? {
??????????????????? xml.appendChild(xmlChildren[i]);
??????????????? }
??????????? }
??????? }
??????????? return xml;
??? }