0

私は少し面白いものに遭遇し、投稿する価値があると思いました:

階層データを使用して実行時にデータプロバイダーを設定する必要がある場合は、AdvancedDataGridを使用しています。アドビのドキュメントは、この種のことを実際にはカバーしていません(少なくとも私が掘り下げることができるレベルでは)。

誰かがこれに遭遇したことがありますか?

私が思いついた唯一のことは少しハックで、高度なグリッドの開示アイコンでいくつかの奇妙な動作を導入しているようです。以下にテストケースを含めました。

AdvancedDataGridProblem.as:

 import mx.collections.ArrayCollection;

 public var dataProvider:ArrayCollection = new ArrayCollection([{label:"item1"},
             {label:"item2", children:[{label:"subItem1"},{label:"subItem2"},
             {label:"subItem3"}]},
             {label:"item3"}]);

 public function init():void{
      //using callLater to ensure that the grid has been created before setting DP
      this.callLater(setDataProvider,[dataProvider]);
 }

 public function setDataProvider(list:ArrayCollection):void{
      heirData.source = list;
 }

およびmxml:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">
     <mx:Script source="advancedDataGridProblem.as"/>


  <mx:AdvancedDataGrid id="advDG" width="100%">

   <mx:columns>
        <mx:AdvancedDataGridColumn headerText="What the heck?"/>
        <mx:AdvancedDataGridColumn headerText="Label" dataField="label"/>
        <mx:AdvancedDataGridColumn headerText="Column 2"/>
        <mx:AdvancedDataGridColumn headerText="Column 3"/>
   </mx:columns>

   <mx:dataProvider>
        <mx:HierarchicalData id="heirData"/>
   </mx:dataProvider>
 </mx:AdvancedDataGrid>

</mx:Application>

テストアプリケーションを実行するとわかるように、[ラベル]列に表示されるはずのアイコンは、実際には「一体何ですか?」に配置されます。桁。[ラベル]列をドラッグして、「一体何ですか?」と交換しようとすると、列では、アイコンは元の場所に残りますが、奇跡的に、以前は[ラベル]列用に整列されたままになっていたラベルが、アイコン用に適切にフォーマットされるようになりました。ラベル列をスロット1からドラッグすると、グリッドが元の状態に戻ります。

これは私の頭の少し上にあります-誰か提案がありますか?

理想的には、このハックをすべて一緒に回避し、実行時に通常どおりdataProviderを割り当てるだけです。

前もって感謝します!

これについては、まもなくadobeにバグレポートを提出し、コメントにリンクを挿入します。

4

2 に答える 2

0

上手..

今日、頭をよく振って新鮮な目を与えるために週末を過ごした後、私は質問の「簡単な」部分の解決策を見つけました。

AdvancedDataGridのdataProviderを直接設定することは、私が当初考えていたよりもはるかに簡単です。ArrayCollectionをHierarchicalDataとしてキャストする必要があります。正直なところ、私は以前にこれを試しましたが、階層のスペルが間違っていまし

とにかく、advancedDataGridProblem.asは次のように変更する必要があります。

import mx.collections.ArrayCollection;
import mx.collections.HierarchicalData;

public var dataProvider:ArrayCollection = new ArrayCollection([{label:"item1"},
                                                                {label:"item2", children:[{label:"subItem1"},{label:"subItem2"},
                                                                {label:"subItem3"}]},
                                                                {label:"item3"}]);

public function init():void{
    //using callLater to ensure that the grid has been created before setting DP
    this.callLater(setDataProvider,[dataProvider]);
}

public function setDataProvider(list:ArrayCollection):void{
    advDG.dataProvider = new HierarchicalData(list);
}

mxmlでのdataProviderの宣言も削除できます。

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">
 <mx:Script source="advancedDataGridProblem.as"/>


<mx:AdvancedDataGrid id="advDG" width="100%">

 <mx:columns>
    <mx:AdvancedDataGridColumn headerText="What the heck?"/>
    <mx:AdvancedDataGridColumn headerText="Label" dataField="label"/>
    <mx:AdvancedDataGridColumn headerText="Column 2"/>
    <mx:AdvancedDataGridColumn headerText="Column 3"/>
 </mx:columns>
 </mx:AdvancedDataGrid>

</mx:Application>

このコードを実行すると、間違った列に開示アイコンが表示されますが、少なくともグリッドのdataProviderをmxmlに設定する「ハック」ソリューションは削除されます。これを行うと、適切な検証とグリッドの表示も可能になります。グリッドのdataProviderを設定すると、適切な表示検証が可能になります。明らかに、dataProviderの階層データのソースを設定しても、同じ検証メソッドが呼び出されないため、ユーザーはグリッドのサイズを変更するか、プログラマーは何らかの方法で検証を強制する必要があります(これは私の人生ではできませんでした)行う)。

開示アイコンの問題については、随時お知らせします。それまでの間、最初の列をロックして、それらのアイコンにのみ使用することは、私のアプリケーションではうまくいくと思います。この「欠陥」を「機能」に変えることさえできます:P

乾杯!

[編集]

バインドされたデータを使用するときに、実装をさらに簡単にし、ビジネスロジックを減らすことができる別の方法は、次のとおりです。

AdvancedDataGridProblem.as:

import mx.collections.ArrayCollection;
import mx.collections.HierarchicalData;

public var dataProvider:ArrayCollection = new ArrayCollection([{label:"item1"},
                                                                {label:"item2", children:[{label:"subItem1"},{label:"subItem2"},
                                                                {label:"subItem3"}]},
                                                                {label:"item3"}]);

mxml:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
 <mx:Script source="advancedDataGridProblem.as"/>


<mx:AdvancedDataGrid id="advDG" width="100%">

 <mx:columns>
    <mx:AdvancedDataGridColumn headerText="What the heck?"/>
    <mx:AdvancedDataGridColumn headerText="Label" dataField="label"/>
    <mx:AdvancedDataGridColumn headerText="Column 2"/>
    <mx:AdvancedDataGridColumn headerText="Column 3"/>
 </mx:columns>

 <mx:dataProvider>
     <mx:HierarchicalData source="{dataProvider}"/>
 </mx:dataProvider>

 </mx:AdvancedDataGrid>

</mx:Application>

このアプローチは、ActionScriptでグリッドのdataProviderを設定した後、グリッドのリストやディスプレイリストなどを手動で無効化および検証する必要があるという問題を回避します。このメソッドを使用する私の1つのマイナーな予約は、これがflex 3で一方向のバインディングを作成するため、バインドされたArrayCollectionを変更するためにHierarchicalDataオブジェクトのメソッドを使用できるかどうかわからないことです。そうは言っても、HierarchicalDataまたはAdvancedDataGridのソースを調べたことはありませんが、ソースを直接変更することは間違いありません。結果が来たら投稿します。

乾杯!

于 2010-09-13T15:26:14.143 に答える
0

上記の開示アイコンの問題を解決するには、AdvancedDataGridの「treeColumn」プロパティを指定して、ツリーデータを含める必要のある列のIDを渡します。

どうやら私は先日livedocsを見て盲目だったようです。

乾杯!

于 2010-09-13T17:31:21.550 に答える