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>

doubleClickEnabled默认情况false下,因此我们必须明确设置它才能捕获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 回答