0

Flex Datagrid の列をクリックしたときに、いくつかの質問があるダイアログ ボックスを開きたいと考えています。ダイアログが閉じられた後、そのセルにダイアログからの情報を入力したいと思います。

私が今まで持っているのはこれです:

        public function startEdit(event:DataGridEvent):void {
            // event.dataField is null, so we figure it out ourselves
            var column:DataGridColumn = dgQObjects.columns[event.columnIndex];
            if (column.dataField == "parameters") {
                // depending on the type, we can fill in parameters
                var type:String = ListCollectionView(dgQObjects.dataProvider).getItemAt(event.rowIndex).type;
                switch(type) {
                    case "Gauge":
                        event.preventDefault();

                        quartzObjects[event.rowIndex].parameters = "foo";
                        updateLocalStorage();
                        dgQObjects.validateNow();
                        break;
                    case "Indicator":
                        break;
                    case "New Row":
                        event.preventDefault();
                        break;
                }
            }

        }

「パラメーター」を「foo」に設定するので、これで問題ありませんが、データグリッドでは表示されません (validateNow() は何もしません)。また、Alert() を挿入すると、startEdit がトリガーされ続け、Alertbox を閉じることができなくなります。グリッドは次のように定義されます。

  <QuartzUI:DoubleClickDataGrid width="800" x="10" y="10" height="337" 
             id="dgQObjects"
             editable="true"
             itemEditBegin="{startEdit(event)}"
             itemEditEnd="{checkQuartzObjects()}"
             creationComplete="{initDataGrid()}"
             >

(DoublieClickDataGrid は DataGrid のサブクラスです)

4

1 に答える 1

0

これは、モデルオブジェクトのデータバインディングを介して行う必要があります。それはあなたの人生をずっと楽にしてくれるでしょう。次のDataGridを想定します。

<s:DataGrid id="dg" dataProvider="{dp}" 
            doubleClickEnabled="true" 
            doubleClick="editSelectedItem()">

    <s:columns>
        <s:ArrayList>
            <s:GridColumn dataField="name" />
        </s:ArrayList>
    </s:columns>
</s:DataGrid>

doubleClickEnabledfalseデフォルトであるため、イベントをキャッチできるように明示的に設定する必要がありdoubleClickます。editSelectedItem()それでは、メソッドを見てみましょう。

private function editSelectedItem():void {
    var popup:MyEditor = new MyEditor();
    popup.data = dg.selectedItem as MyClass;
    PopUpManager.addPopUp(popup, this, true);
    PopUpManager.centerPopUp(popup);
}

新しいビューを作成し、現在選択されているデータグリッドアイテムに渡します。次に、モーダルポップアップとして開きます。(例をできるだけ単純にするために、ポップアップを再度閉じるためのコードを追加していないことに注意してください)。これで、MyEditorビューは次のようになります。

<s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:m="net.riastar.model.*"
         title="Edit label"
         width="400" height="300" >

    <fx:Declarations>
        <m:MyClass id="data" />
    </fx:Declarations>

    <s:TextInput text="@{data.name}" />

</s:Panel>

nameインスタンスのプロパティを編集するには、双方向のデータバインディングを使用しMyClassます(これを機能させるには、このプロパティにマークを付ける必要があることに注意してくださいBindable)。これは実際の例としては十分です。TextInputの値を編集すると、それに応じた値の変化がバックグラウンドのDataGridに表示されます。

于 2012-06-01T14:40:46.520 に答える