1

フラット DP でうまく動作するようにチェックボックス ヘッダー レンダラーを取得しましたが、階層的なコレクション ビューは別の話です。クリックすると、特定の列のすべてのチェックボックスが選択されます。これが私のコードです:

var dp:HierarchicalCollectionView = _dataGrid.dataProvider as HierarchicalCollectionView; var testDp:GroupingCollection = dp.source as GroupingCollection; var rawDp:ArrayCollection = testDp.source as ArrayCollection;

for(var i:int=0 ; i < rawDp.length ; i++){ rawDp[i][_dataField] = cb.selected; }

第 2 レベルのデータのすべてのチェックボックスを選択しますが、最上位レベルのデータは選択しません。ここで何が欠けていますか?私はそれを見つけることができないようです。

どんなヒントでも大歓迎です。ありがとうございました。

4

1 に答える 1

1

階層データの場合、階層データのすべてのレベルを反復処理するカーソルを使用する必要があります。

var dp:IHierarchicalCollectionView = _dataGrid.hierarchicalCollectionView;
var cursor:IViewCursor= dp.createCursor();

while (!cursor.afterLast)
{
    cursor.current[_dataField] = cb.selected;
    cursor.moveNext();
}

ただし、これは以前に開かれたノードでのみ機能します。したがって、すべてのノードを展開する_dataGrid.expandAll()(ノードは 1 回だけ開く必要があるため、後で折りたたむことができます) か、階層データを手動で繰り返します。

function setCheckBoxValue(children:ArrayCollection, value:Boolean):void
{
    for each (var child:Object in children)
    {
        if (child.hasOwnProperty("children") && child["children"])
            setCheckBoxValue(child["children"], value);

        child[_dataField] = value;
    }
}

var myDataProvider:HierarchicalData = /* your data provider */;

// Call it like this...
setCheckBoxValue(myDataProvider.source, cb.selected);

更新:2番目の質問に答えるには...

  1. CheckBoxColumn拡張する新しいを作成しますAdvancedDataGridColumnheaderRendererこれを使用して、およびを事前設定できますitemRenderer
  2. カスタム アイテム レンダラーでは、次のように列を取得します。
    grid = AdvancedDataGrid(listData.owner);
    column = grid.columns[listData.columnIndex] as CheckBoxColumn;
  3. ヘッダー レンダラーで同じことを行います。
  4. いずれかの項目レンダラーの CheckBox 値が変更されるたびに、列を介してイベントが送出されます。何かのようなもの:column.dispatchEvent(new Event("checkBoxValueChanged"));
  5. ヘッダー レンダーは、「checkBoxValueChanged」イベント (または任意の名前) の列にイベント リスナーを追加する必要があります。そのイベントが発生するたびに、データ プロバイダーをループし、それに応じてヘッダーの CheckBox を更新します。

理論的にはうまくいくはずです。HTH

于 2011-01-07T16:05:44.693 に答える