Flex Tree 通过Arraycollection转化为XML数据源,新增、删除、修改功能的整合
以前在网上找代码,找到的总是不合用,今天我整理一份Flex Tree 通过Arraycollection转化为XML数据源,新增、删除、修改功能的整合,有需要的拿过去,转载请注明出处,不瞎扯了,上图上代码。。。
调用代码:
<?xml version="1.0" encoding="utf-8"?><mx:Application backgroundColor="white" creationComplete="resetData();" fontSize="12" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"><mx:Script><![CDATA[import mx.utils.ArrayUtil;import mx.rpc.xml.SimpleXMLDecoder;import mx.collections.XMLListCollection;import mx.collections.ArrayCollection;import mx.controls.Alert;[Bindable]var xml:XML=new XML();[Bindable]var arrayString:String='[{id:"1",name:"root",parentId:"-1"},\n'+'{id:"2",name:"node1-1",parentId:"1"},\n'+'{id:"3",name:"node2-1",parentId:"2"},\n'+'{id:"4",name:"node2-2",parentId:"2"},\n'+'{id:"5",name:"node4-1",parentId:"4"},\n'+'{id:"6",name:"node1-2",parentId:"1"},\n'+'{id:"7",name:"node5-1",parentId:"5"},\n'+'{id:"7",name:"node3-1",parentId:"3"}]';var array:ArrayCollection=new ArrayCollection([{id:"1",name:"root",parentId:"-1"},{id:"2",name:"node1-1",parentId:"1"},{id:"3",name:"node2-1",parentId:"2"},{id:"4",name:"node2-2",parentId:"2"},{id:"5",name:"node4-1",parentId:"4"},{id:"6",name:"node1-2",parentId:"1"},{id:"7",name:"node5-1",parentId:"5"},{id:"7",name:"node3-1",parentId:"3"}]);//显示树(转换数据)private function resetData():void{xml=new Array2XmlTree().getTreeData(array,"id","parentId");}//添加当前节点之后的兄弟节点private function addAfterNode():void{var selectedItemXML:XML=this.tree.selectedItem as XML;if(null!=selectedItemXML){var afterId:Number=new Date().getMilliseconds();var sparentId:String=selectedItemXML.parent().@id;var afterNode={id:afterId.toString(),name:testName.text,parentId:sparentId}new Array2XmlTree().addAfterNode(afterNode,selectedItemXML);changedData.text=xml.toXMLString();}}//添加当前节点之前的兄弟节点private function addBeforeNode():void{var selectedItemXML:XML=this.tree.selectedItem as XML;if(null!=selectedItemXML){var beforeId:Number=new Date().getMilliseconds();var sparentId:String=selectedItemXML.parent().@id;var beforeNode={id:beforeId.toString(),name:testName.text,parentId:sparentId}new Array2XmlTree().addBeforeNode(beforeNode,selectedItemXML);changedData.text=xml.toXMLString();}}//添加子节点private function addChildNode():void{var selectedItemXML:XML=this.tree.selectedItem as XML;if(null!=selectedItemXML){var childId:Number=new Date().getMilliseconds();var sparentId:String=selectedItemXML.@id;var childNode={id:childId.toString(),name:testName.text,parentId:sparentId}new Array2XmlTree().addChildNode(childNode,selectedItemXML,tree);changedData.text=xml.toXMLString();}}//重命名节点private function renameNode():void{var selectedItemXML:XML=this.tree.selectedItem as XML;if(null!=selectedItemXML){new Array2XmlTree().renameNode(selectedItemXML,"name",testName.text);changedData.text=xml.toXMLString();}}//删除节点private function delNode():void{var selectedItemXML:XML=this.tree.selectedItem as XML;if(null!=selectedItemXML){new Array2XmlTree().delNode(selectedItemXML);changedData.text=xml.toXMLString();}}]]></mx:Script><mx:Button label="resetData" click="resetData();" x="0" y="479"/><mx:Button label="addAfterNode" click="addAfterNode();" x="414" y="479"/><mx:Button label="addChildNode" click="addChildNode();" x="569" y="479"/><mx:Button label="addBeforeNode" click="addBeforeNode();" x="256" y="479"/><mx:Button label="renameNode" click="renameNode();" x="719" y="479"/><mx:Button label="delNode" click="delNode();" x="867" y="479"/><mx:Tree id="tree" width="250" labelField="@name" dataProvider="{xml}" y="30" height="432" x="0"/><mx:TextArea editable="false" x="276" text="{arrayString}" y="30" width="362" height="432"/><mx:TextArea id="changedData" editable="false" x="674" text="{xml.toXMLString()}" y="30" width="368" height="432"/><mx:Label x="276" y="2" text="初始化arraycollection数据:" width="183"/><mx:Label x="10" y="2" text="树:" width="183"/><mx:Label x="674" y="2" text="转换XML后的数据:" width="183"/><mx:TextInput text="测试节点" id="testName" x="80" y="479"/></mx:Application>
?工具类代码:
/** * ArrayCollection转换树结构数据、添加、删除、重命名节点 * Date:2012-04-07 * Author:Tangdl * * 数据转换使用方法: * treeData=new Array2Tree().getTreeData(array,"id","parentId","-9999"); * array:数据库查询数据ArrayCollection * id:数据库查询字段标识 * parentId:数据库查询字段父亲标识 * -9999:根节点父亲标识,默认为-1 * * 添加兄弟节点(之后)使用方法: * new Array2XmlTree().addAfterNode(afterNode,selectedItemXML); * afterNode:添加的节点对象 * selectedItemXML:当前选中节点的XML * * 添加兄弟节点(之前)使用方法: * new Array2XmlTree().addBeforeNode(beforeNode,selectedItemXML); * beforeNode:添加的节点对象 * selectedItemXML:当前选中节点的XML * * 添加子节点使用方法: * new Array2XmlTree().addChildNode(childNode,selectedItemXML,tree); * childNode:添加的节点对象 * selectedItemXML:当前选中节点的XML * tree:树对象 * * 重命名节点使用方法: * new Array2XmlTree().renameNode(selectedItemXML,"name",testName.text); * selectedItemXML:当前选中节点的XML * "name":需要重名名的字段名称 * testName.text:新名称字符串 * * * 删除节点使用方法: * new Array2XmlTree().delNode(selectedItemXML); * selectedItemXML:当前选中节点的XML * */package{import mx.collections.ArrayCollection;import mx.controls.Tree;public class Array2XmlTree {/** * 对比标识(parentNodeIdName,nodeIdName) * 原始数据 * 根节点标识 */private var parentNodeIdName, nodeIdName, rootFlag:String;private var assembleArray:ArrayCollection=new ArrayCollection();/** * 返回树形结构数据类型*/public function getTreeData(sourceArray:ArrayCollection, nodeIdName:String="NODE_ID", parentNodeIdName:String="PARENT_NODE_ID", rootFlag:String="-1"):XML {//初始化数据this.parentNodeIdName=parentNodeIdName;this.nodeIdName=nodeIdName;this.assembleArray=sourceArray;this.rootFlag=rootFlag;//拼装树数据var treeDataArray:ArrayCollection=new ArrayCollection();var treeXml:XML=assembleTree();return treeXml;}/** * 递归拼装Flex树需要的数据类型 */public function assembleTree(nodeObject:Object=null):XML {//查找根节点if (nodeObject == null) {for each (var tmplNodeObject:Object in assembleArray) {if (tmplNodeObject[parentNodeIdName].toString() == rootFlag) {nodeObject=tmplNodeObject;break;}}}//创建xml对象var treeXml:XML=new XML("<node></node>");for(var objectKey:String in nodeObject){treeXml["@"+objectKey]=nodeObject[objectKey];}//查找子节点if (hasChild(nodeObject)) {for each (var childObject:Object in getChildList(nodeObject)) {treeXml.appendChild(assembleTree(childObject));}}return treeXml;}/** * 判断是否有子节点 */private function hasChild(nodeObject:Object):Boolean {return getChildList(nodeObject).length > 0 ? true : false;}/** * 得到子节点列表 */private function getChildList(nodeObject:Object):ArrayCollection {var childArray:ArrayCollection=new ArrayCollection();for each (var childObject:Object in assembleArray) {if (childObject[parentNodeIdName].toString() == nodeObject[nodeIdName].toString()) {childArray.addItem(childObject);}}return childArray;}/** * 添加兄弟节点(之后) * */ public function addAfterNode(afterNodeObject:Object,selectedNodeXml:XML):void{ //获取当前选择对象的父亲对象并转化为XML var parentNodeXml:XML=selectedNodeXml.parent(); //新增节点 var treeXml:XML=new XML("<node></node>"); for(var objectKey:Object in afterNodeObject){ treeXml["@"+objectKey]=afterNodeObject[objectKey]; } //在当前节点之后添加兄弟节点 parentNodeXml.insertChildAfter(selectedNodeXml,treeXml); } /** * 添加兄弟节点(之前) * */ public function addBeforeNode(beforeNodeObject:Object,selectedNodeXml:XML):void{ //获取当前选择对象的父亲对象并转化为XML var parentNodeXml:XML=selectedNodeXml.parent(); //新增节点 var treeXml:XML=new XML("<node></node>"); for(var objectKey:Object in beforeNodeObject){ treeXml["@"+objectKey]=beforeNodeObject[objectKey]; } //在当前节点之前添加兄弟节点 parentNodeXml.insertChildBefore(selectedNodeXml,treeXml); } /** * 添加子节点 * */ public function addChildNode(childNodeObject:Object,selectedNodeXml:XML,currentTree:Tree,isExpand:Boolean=true):void{ //新增节点 var treeXml:XML=new XML("<node></node>"); for(var objectKey:Object in childNodeObject){ treeXml["@"+objectKey]=childNodeObject[objectKey]; } //在当前节点添加子节点 selectedNodeXml.appendChild(treeXml); // 添加后是否展开 if(isExpand){ currentTree.expandChildrenOf(selectedNodeXml,true); } } /** * 重命名节点 * */ public function renameNode(selectedNodeXml:XML,renameField:String,renameString:String):void{ selectedNodeXml["@"+renameField]=renameString; } /** *删除节点 * */ public function delNode(selectedNodeXml:XML):void{if(selectedNodeXml!=null) {var parent:XML=selectedNodeXml.parent();if(parent!=null) {var children:XMLList=parent.children();for(var i:int=0;i<children.length();i++) {if(children[i]==selectedNodeXml) {delete children[i];break;}}}} }}}
?上图,上附件。。。。。
?搜索功能正在整理中,ing。。。。。
?有问题请留言,如有改进也请留言,谢谢,哈哈。。。。