Objects have UIDs assigned to them when used in Tree and other list components. If you create new Objects, even if they have the same data, they will have different UIDs. The openItems may not be matching correctly because of that. You can copy the UID if you want to, but be aware of the dangers of having mutiple objects with the same UID.
On 2/22/10 12:45 AM, "Patil Yogesh" <[email protected]> wrote: I am facing a problem while updating dataprovider for tree control. DataProvider is dependent on two different data sources..... Using which I am building new collection which acts as a dataprovider to tree control. I want to add/update/delete data in either one or both data sources. It should get reflected in tree control. But I am facing problem while doing so.... I have expended nodes in tree and then if i try to update data source, tree control does reflect the changes but it closes all expanded nodes. Following is the sample prototype: <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/halo" initialize="initTree(event)"> <fx:Script> <![CDATA[ import mx.collections.ArrayCollection; import mx.events.CollectionEvent; import mx.events.FlexEvent; [Bindable] private var treeData : ArrayCollection = new ArrayCollection(); [Bindable] private var testData : ArrayCollection; [Bindable] private var testData2 : ArrayCollection; private var openItems : Object; private var refresh : Boolean = false; //---------------------------------------------------------- protected function initTree(event:FlexEvent):void { treeData.addEventListener(CollectionEvent.COLLECTION_CHANGE, update); testData = new ArrayCollection([{label:"One"}, {label:"Two"}, {label:"Three"}]); testData2 = new ArrayCollection([{label:"One"}, {label:"Two"}, {label:"Three"}]); updateData(); } //---------------------------------------------------------- protected function button_clickHandler(event : MouseEvent):void { openItems = treeControl.openItems; testData.addItem({label:"updating"}); updateData(); } //---------------------------------------------------------- // Build data provider as per requirement private function updateData() : void { var tree : ArrayCollection = new ArrayCollection(); for(var i : int = 0; i < testData.length; i++) { var col : ArrayCollection = new ArrayCollection(); for(var j : int = 0; j < testData2.length; j++) { if(testData.getItemAt(i).label == testData2.getItemAt(j).label) { col.addItem({label:testData2.getItemAt(j).label}); } } tree.addItem({label:testData.getItemAt(i).label, children:col}); } treeData = tree; } //---------------------------------------------------------- private function update() : void { refresh = true; } //---------------------------------------------------------- protected function treeControl_renderHandler(event:Event):void { if(refresh) { treeControl.invalidateList(); refresh = false; treeControl.openItems = openItems; treeControl.validateNow(); } } ]]> </fx:Script> <mx:VBox width="100%"> <s:Button id="button" click="button_clickHandler(event)" label="Click"/> <mx:Tree id="treeControl" width="100%" right="-1" left="-1" bottom="-1" top="44" borderAlpha="0.75" dataProvider="{treeData}" render="treeControl_renderHandler(event)"/> </mx:VBox> </s:Application> ----- -- Regards, Yogesh Patil. -- Alex Harui Flex SDK Team Adobe System, Inc. http://blogs.adobe.com/aharui

