根据用户输入的关键字,在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;
}