0

異なるレベルに複数の親があるチャートで、子要素がそれ自体と一緒に移動するという問題があります。これはちょっと奇妙なことで、同じ要素であることを示すための機能であると思いますが、データグリッドでは見落とされ、グリッドから切り離されることがあります。

編集:これは同じオブジェクトを使用しているためですが、両方の場所で同じオブジェクトを使用したいので、どちらかをクリックすると同じdg.selectedItemが表示されます。異なるオブジェクトを使用せずに、ツリー内の移動が1つではなく両方のオブジェクトで発生しないようにする方法を探しています(可能な場合)。

問題を説明するために、このコードに簡略化しました。

<?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を拡張する前

親2の子1を拡張した後:

親2の子1を拡張した後

これを防ぐ方法はありますか?

4

3 に答える 3

1

答えはいいえだ。同じアイテムを複数の場所に表示することはできません。上で述べたような小さな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];
于 2012-04-17T19:33:22.770 に答える
1

ツリー内のノードは、ツリー内に1回だけ表示されます。限目。ノードの参照(オブジェクトID)は、ツリー内のノードの場所を識別します。複数回追加すると、ツリー内のノードがどこにあるかを知る必要があるすべてのメカニズムが壊れます。反対の方法のみが機能します(どのノードが特定の位置にあるかを知る)。副作用の1つは、インデントが間違っていることです。ノードの子が表示されると、必要なインデントが計算され、その外観に適用されます。ツリー内のすべてのオカレンスで、インデントレベルがまったく異なるかどうかは関係ありません。

さまざまな場所で同じデータを表示する必要がある場合は、ツリーノードをデータを保持するオブジェクトのラッパーにするだけです。ツリーndoは独立したオブジェクトですが、参照するオブジェクトから名前、アイコン、ツールチップ、whoateverをフェッチします。そして、この「データオブジェクト」は、任意の数のツリーノードから参照できます。クリックされたデータを知る必要がある場合でも、メッセージからツリーノードへの参照を取得し、そこからデータオブジェクトへの参照をフェッチしてさらに処理することができます。

于 2018-05-29T13:43:52.847 に答える
0

さて、ここにあなたの問題があります。

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

1つのオブジェクトを作成し、複数の場所で使用しています。
AS3では、オブジェクトは参照によって渡されます。
そうは言っても、1つの要素でオブジェクトを変更すると、それらの「すべて」でオブジェクトが変更されます。
私のサンプルでは、​​同じオブジェクトを何度も参照する代わりに、関数を使用して新しいオブジェクトを作成していることに注意してください。

<?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を調べたい場合もあります

于 2012-04-17T19:03:45.967 に答える