4

行の選択を可能にするチェックボックス アイテム レンダラーをクロームに持つデータ グリッドがあります。

主な用途:


<mx:DataGrid id="dg">
    <mx:columns>
        <mx:DataGridColumn id="ir" itemRenderer="renderers.RowCheckbox" /> 
        <mx:DataGridColumn dataField="Name" headerText="Name" /> 
    </mx:columns>
</mx:DataGrid>

アイテム レンダラー:


<-- RowCheckbox -->
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" horizontalAlign="center"> 
    <mx:CheckBox id="chk"/>
</mx:HBox>

どの行がチェックされているかを判断できるように、アイテムレンダラー/チェックボックスへのハンドルを取得するにはどうすればよいですか?

4

4 に答える 4

9

アドバイスの一言:アプリケーションでも同様の問題が発生し、データグリッドのデータプロバイダーのエンティティに「選択された」プロパティを追加することで問題を解決しました。次に、checkBoxの選択されたプロパティが、エンティティの選択されたプロパティにバインドされました。どれが選択されたかを知るために、アイテムレンダラーではなくデータプロバイダーのエンティティをループしました。多くの異なるアプローチの後、これは本当に最良の選択肢でした。

私が正しく覚えていれば、問題は、アイテムレンダラーが選択された状態を正しく覚えておらず、上下にスクロールしたときにデータグリッドが完全に台無しになっていたことでした。スクロール後に間違った行が選択されました。

もう1つのオプションは、データグリッドをホストしているコントロールに至るまでバブルアップするイベントをアイテムレンダラーにディスパッチすることです。次に、これらのイベントをリッスンし、モデルを更新して変更を反映させることができます。

于 2009-02-08T06:58:10.060 に答える
2

DataGrid と複数のアイテム レンダラー、およびスクロール時のアイテム レンダラーの再利用で同様の問題に遭遇しました。DataGrid アイテム レンダラーにアクセスするために、DataGrid を拡張しました。私が最初に考えたのは、indexToIndex() に続いて indexToItemRenderer() を使用することでした。残念ながら、これらのメソッドは期待どおりに動作しなかったため、indexesToItemRenderer() メソッドを追加しました。

パッケージcom.whatever.controls {

import mx.controls.DataGrid;
import mx.controls.listClasses.IListItemRenderer;

public class CustomDataGrid extends DataGrid
{

    public function CustomDataGrid()
    {
        super();
    }

    public function indicesToItemRenderer(rowIndex:int, colIndex:int):IListItemRenderer
    {
        var firstItemIndex:int = verticalScrollPosition - offscreenExtraRowsTop;
        if (rowIndex < firstItemIndex ||
            rowIndex >= firstItemIndex + listItems.length
            )
        {
            return null;
        }

        return listItems[rowIndex - firstItemIndex][colIndex];
    }

}

スクロール時に再利用されるアイテム レンダラーの問題を解決するには、次の記事を参照してください。

http://www.adobe.com/devnet/flex/articles/itemrenderers_pt1.html

要するに、データ セッターをオーバーライドし、プロパティをデータに格納します。たとえば、CheckBox itemRenderer を使用する列と ComboBox を使用する別の列がありました。プロパティが変更されるたびに変更イベントをリッスンし、selected、selectedIndex などをデータに保存し、データ セッターをオーバーライドしてそれらのプロパティを設定します。

        override public function set data(value:Object):void
        {
            if (value != null)
            {
                super.data = value;

                if (data.hasOwnProperty('selected') && data.selected)
                {
                    selected = data.selected;
                }
                else
                {
                    selected = false;
                }
            }
        }
于 2009-05-12T15:03:42.303 に答える
0

indexToItemRenderer()ListBase のすべてのサブクラスによって公開されるメソッド を使用できます。

例えば:

private function someFunction(index:int):void
{
    var rowCheckbox:RowCheckbox = dg.indexToItemRenderer(index) as RowCheckbox;
    trace(rowCheckbox.chk.selected.toString());
}

... ここでindex、「chk」プロパティをテストする DataGrid アイテムのインデックスを表します。

于 2009-02-07T23:02:38.490 に答える
-1

ItemRenderer で、Checkbox コンポーネントを VBox に配置してみてください。スクロールの問題が解決します。

于 2010-05-26T11:12:10.567 に答える