Flex:从Tree控件中提取数据

时间:2009-04-06 22:33:29

标签: xml flex tree

因此,Flex为用户操作数据馈送控件提供了很好的API,但是,就我而言,一旦用户完成播放,我无法弄清楚如何将数据从控件中取回它。具体来说,我已经在Tree组件上启用了dragMove控件,但我无法弄清楚如何将用户启动的更改恢复为我可以写回db的XML数据。

当用户重新排序树时,dataProvider中没有注册任何更改,并且如果dataDescriptor正在注册这些更改,我不知道如何恢复数据。 dataDescriptor方法getData()调用节点参数....哪个节点?来自自己的dataProvider的节点??我不明白。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我相信你要做的就是听取dragOver事件并操纵该处理程序中的结果数据。拖放支持主要用于从一个列表控件转移到另一个控件。

答案 1 :(得分:1)

CookieOfFortune是正确的:如果你想做的不仅仅是标称拖放(例如检测更改并将它们传播到数据库),你可能需要使用拖动和放大器。删除树上的界面。

您还可以设置侦听器以检测树何时发生更改(例如,已发生选择)。这适用于选择和拖动&下降。

不知道你在做什么,这里有一些代码。我只是覆盖dragComplete,以显示如何检测事件。

<?xml version='1.0'?>
<mx:Application xmlns:mx='http://www.adobe.com/2006/mxml' backgroundGradientColors='[0xFFFFFF,0xAAAAAA]'>

    <mx:Script>
        <![CDATA[
        import mx.events.DragEvent;
        import mx.controls.Alert;

        [Bindable]
        private var treeData:XML =
            <root>
                <node label="foo">
                    <node label="bar" />
                </node>
                <node label="baz">
                    <node label="buzz">
                        <node label="foobar" />
                    </node>
                </node>
            </root>;

        private function detectChange(event:Event):void {
            Alert.show("change detected!");
        }
        private function detectDragComplete(event:DragEvent):void {
            Alert.show("drag completed!");
        }

        ]]>
    </mx:Script>

  <mx:Tree id="tree" labelField="@label" 
           dataProvider="{treeData.node}" width="200"
           dragEnabled="true"
           dropEnabled="true"
           dragMoveEnabled="true"
           dragComplete="detectDragComplete(event)"
           change="detectChange(event)" />
</mx:Application>

以下是一些链接,其中包含有关各种控件中拖放功能的更多信息:

答案 2 :(得分:0)

我必须做同样的事情。我在dataEvider上为CollectionEvent.COLLECTION_CHANGE事件上的树设置了一个事件监听器。

public function init():void{

        //watch the tree dataProvider changes.
        BindingUtils.bindSetter(setUpDataChangeListner,_tree,["dataProvider"]);
    }

    public function setUpDataChangeListner(value:XMLListCollection):void{
        //set up the event listener for the dataProvider as long as it is not null
        if(value)
            value.addEventListener(CollectionEvent.COLLECTION_CHANGE,onTreeChanged,false,0,true);
    }

    public function onTreeChanged(event:CollectionEvent):void{
        trace("fun");
    }