如何在DataGrid中获取ComboBox的值

时间:2010-05-12 22:28:27

标签: flex datagrid combobox

虽然这可能是一个简单的问题,但我有一段时间想出一个解决方案。

我有一个DataGrid,其中一个ComboBox作为我的一个列的ItemRenderer。当用户选择一行时,我想获得所选行的ComboBox选定值。

编辑:我应该提到myData中的dataField2_Array属性实际上是一个Array,它是ComboBox的dataProvider。 myData中的每个对象在该Array中的值可能完全不同,因此DataGrid每行中的ComboBox可以有完全不同的选项供选择。

有什么建议吗?

一些示例代码:

<mx:DataGrid id="myGrid"
  dataProvider="{myData}">
    <mx:columns>
      <mx:DataGridColumn headerText="Column 1" dataField="dataField1" />
      <mx:DataGridColumn headerText="Column 2" dataField="dataField2_Array">
        <mx:itemRenderer>
          <mx:Component>
            <mx:HBox paddingLeft="5">
              <mx:ComboBox id="myComboBox" dataProvider="{data.dataField2_Array}" />
            </mx:HBox>
          </mx:Component>
        </mx:itemRenderer>
      </mx:DataGridColumn>
    </mx:columns>
</mx:DataGrid>

2 个答案:

答案 0 :(得分:2)

<mx:DataGrid ="MyDataGrid">
<mx:columns>
<mx:DataGridColumn headerText="Resource" width="200" itemRenderer="com.myClasses.myGridDropdownRenderer"/>
</mx:columns>
</mx:DataGrid>

这是您的datagrid的itemRenderer。

<?xml version="1.0" encoding="utf-8"?>
<mx:ComboBox prompt="Please select a Rating" change="stuffChanged()" dataProvider="{data.dataField2_Array}"
     xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
        <![CDATA[
            import flash.events.Event;
            import mx.controls.Alert;
            import mx.core.Application;
            import mx.collections.ArrayCollection;



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

            }



           public function stuffChanged():void{
               var myListData:DataGridListData = DataGridListData(listData);
               var r:int=myListData.rowIndex;
               var c:int=myListData.columnIndex;
              //Application.application.whateverStuff[r+1][c]=this.value;
               Application.application.whateverStuff[r+1][c]=
              this.selectedItem.data;
              }



        ]]>
    </mx:Script>

</mx:ComboBox>

这将在您的主应用程序中保存此值。

[Bindable] public var whateverStuff:ArrayCollection;

现在,当您的数据发生变化时,它会保存数据。单击该按钮可将此值存储在rows对象中。

[Bindable] public var rows:Object = new Object();
rows=Application.application.whateverStuff; 

当您将值发送回数据库时,请同时发送此行对象。

<强>更新

在我阅读了您之前的反击意见后,我发现每个组合框都有不同的选项。你应该早点提到它。

当您单击所选行时,您应该能够收集行的ID,这将确保在数据库中只更新该行的ID,即使您更新其他行的组合框也是如此。

选择行后,单击并验证使用“警报”或“跟踪”选择的行ID,然后通过事件调度程序单独发送该行值。

答案 1 :(得分:1)

将一个名为myGrid_click的函数添加到DataGrid的click事件中:

<mx:DataGrid id="myGrid" dataProvider="{myData}" click="myGrid_click(event)" >

在这个函数中,存储网格的selectedIndex并使用它来从dataProvider中获取对象(假设它是一个MyObjects数组,我们对这些MyObjects的dataField2属性感兴趣):

public function myGrid_click(event:MouseEvent):void {
    var index:int = myGrid.selectedIndex;
    var obj:MyObject = myData[index];
    var value:String = obj.dataField2;
}

如果通常情况下,对象不存储实际值,并且只是将索引存储到查找表(dataField2_Array?),则编写for循环以迭代dataField2_Array查找该值(actualValue) )并将其分配给先前声明的更大范围的变量(selectedRowComboBoxValue):

public function myGrid_click(event:MouseEvent):void {
    var index:int = myGrid.selectedIndex;
    var obj:MyObject = myData[index];
    var value:int = obj.dataField2;

    for (var i:int = 0; i < dataField2_Array.length; i++) {
        if (value == dataField2_Array[index].id) {
            selectedRowComboBoxValue = dataField2_Array.actualValue;
            break;
        }
    }
}