apache-flex 如何阻止具有HierarchicalData的AdvancedDataGrid将具有多个父级的子元素移动到不同级别?

u3r8eeie  于 2022-11-01  发布在  Apache
关注(0)|答案(3)|浏览(148)

我遇到了一个问题,在图表中,我的子元素与其自身一起移动,而它在不同级别上有多个父元素。这有点奇怪,我认为它可能是为了说明它是同一个元素而设计的功能,但它在我的数据网格中看起来很奇怪,有时它会从网格中分离出来!

**EDIT:**我知道这是因为我使用了相同的对象,但我希望在两个位置都使用相同的对象,这样当我单击其中一个时,我会得到相同的dg. selectedItem。我正在寻找一种方法来防止在两个对象而不是一个对象上发生树内移动(如果可能),而不是使用不同的对象。

我将其简化为以下代码来说明问题:

<?xml version="1.0" encoding="utf-8"?>
<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/mx" minWidth="955" minHeight="600"
               creationComplete="init()">

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;

            [Bindable] var ac:ArrayCollection;

            public function init():void
            {
                ac = new ArrayCollection();
                var objWithMultipleParents:Object = {name:"Awkward family tree"};
                ac.addItem({
                    name:"Parent 1",
                    children:[
                        objWithMultipleParents,
                        {name:"Child of Parent 1"}  
                    ]
                });
                ac.addItem({
                    name:"Parent 2",
                    children:[
                        {name:"Child of Parent 2",children:[objWithMultipleParents]},
                        {name:"Child #2 of Parent 2"}
                    ]
                });
            }

        ]]>
    </fx:Script>

    <mx:AdvancedDataGrid id="dg" width="100%" height="100%">
        <mx:dataProvider>
            <mx:HierarchicalData source="{ac}" />
        </mx:dataProvider>
        <mx:columns>
            <mx:AdvancedDataGridColumn dataField="name" headerText="Groups"/>
        </mx:columns>
    </mx:AdvancedDataGrid>
</s:Application>

在展开父项2的子项1之前:

展开父项2的子项1之后:

有没有办法防止这种情况发生?

tjjdgumg

tjjdgumg1#

答案是否定的。你不能在多个地方显示同一个项目。你会遇到像上面提到的那样的小UI怪癖。但是,你可以显示项目的平面副本,然后使用某种形式的唯一标识符访问项目。

//store item reference in accessible object
obj = new Object();
obj[itemRef.uid] = itemRef;

//copy enough information to display and re-access correctly
copy1.name = itemRef.name;
copy1.uid = itemRef.uid;
parent1.add(copy1);

copy2.name = itemRef.name;
copy2.uid = itemRef.uid;
parent2.add(copy2);

//on item selection, access it through uid
itemRef = obj[dg.selectedItem.uid];

如果您没有任何类型的UID,也不想创建一个,您也可以使用平面副本作为项目键。

//make copies
copy1.name = itemRef.name;
copy2.name = itemRef.name;
parent1.add(copy1);
parent2.add(copy2);

//map references
obj[copy1] = itemRef;
obj[copy2] = itemRef;

//re-access
itemRef = obj[dg.selectedItem];
5q4ezhmt

5q4ezhmt2#

树中的任何节点在树中只能出现一次。句号。引用节点的(对象ID)标识它在树中的位置。多次添加它将破坏需要知道节点在树中位置的所有机制。只有相反的方式才有效(知道哪个节点在某个位置)。副作用之一是错误的缩进。当显示一个节点的子节点时,计算所需的缩进,并将其应用于其外观-在树中的所有出现处,而不管它们是否在完全不同的缩进级别上。
如果你需要在不同的地方显示相同的数据,让你的树节点只是一个保存数据的对象的 Package 器。树节点是独立的对象,但是从它们引用的对象中获取它们的名称、图标、工具提示等等。并且这个“数据对象”可以被任意数量的树节点引用。即使当需要知道哪些数据被点击时,您可以从消息中获取对树节点的引用,并从消息中获取对数据对象的引用以进行进一步处理。

yizd12fk

yizd12fk3#

好吧,这就是你的问题。

var objWithMultipleParents:Object = {name:"Problem"};

您正在创建一个对象并在多个地点使用。
在AS3中,对象是通过引用传递的。
也就是说,如果你改变一个元素中的对象,你就是在改变“所有”元素中的对象。
请注意,在我的示例中,我使用了一个函数来创建一个新对象,而不是反复引用同一个对象。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    minWidth="955" minHeight="600"
               creationComplete="init()">
<mx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;

        [Bindable]
        public var ac:ArrayCollection;

        public function init():void
        {
            ac = new ArrayCollection();
            var objWithMultipleParents:Object = createObject( );
            ac.addItem({
                name:"Parent 1",
                children:[
                    objWithMultipleParents,
                    {name:"Child of Parent 1"}  
                ]
            });
            ac.addItem({
                name:"Parent 2",
                children:[
                    {name:"Child of Parent 2",children:[createObject( )]},
                    {name:"Child #2 of Parent 2"}
                ]
            });
        }
        public function createObject( ):Object{
            return {name:"Problem"}
        }

    ]]>
</mx:Script>

<mx:AdvancedDataGrid id="dg" width="100%" height="100%">
    <mx:dataProvider>
        <mx:HierarchicalData source="{ac}" />
    </mx:dataProvider>
    <mx:columns>
        <mx:AdvancedDataGridColumn dataField="name" headerText="Groups"/>
    </mx:columns>
</mx:AdvancedDataGrid>

此外,您可能还想了解一下HierarchicalData

相关问题