2010-05-12 114 views
0

虽然这可能是一个简单的问题,但我有一段时间想出解决方案。如何获取DataGrid中ComboBox的值

我有一个DataGrid组合框作为ItemRenderer用于我的一列。当用户选择一行时,我想获取所选行的ComboBox的选定值。

编辑:我应该提到myData中的dataField2_Array属性实际上是一个Array是ComboBox的dataProvider。 myData中的每个对象在该数组中可以有完全不同的值,因此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
<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; 

现在,当您的数据发生变化时,它将保存数据。你点击按钮将这个值存储在一个行对象中。

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

当您发送值回数据库,将所有与该行对象一起。

更新:

后,我看了上一还击你的评论,我才知道,每个组合框有不同的选择。你应该早点提到它。

当您单击选定的行时,您应该能够收集该行的ID,这将确保只有该行的ID在数据库中得到更新,无论您是否更新其他组合框行。

一旦您选择了一行,单击并使用警报或跟踪验证您选择了哪个行ID,然后通过事件分派器单独发送该行值。

+0

感谢您的答复葡萄酒,但我不是很在这里跟随你。这看起来像它会在我的数据网格中显示组合框,但是如何在选择数据网格行时获取组合框的选定值? 例如,如果有人双击一行来选择它,我想获得该行中组合框的选定值。 – 2010-05-13 15:20:20

+0

我已更新代码,请告知我是否需要更多说明或帮助 – Thalaivar 2010-05-14 11:15:12

+0

因此,如果我有这个权利,每次用户从ComboBox中选择一个值,它都会更新应用程序级别的whateverStuff变量。当选择一行时,它会去抓取存储在whateverStuff变量中的数据,并传递给我用来更新数据库的任何方法。如果用户从一行中的ComboBox中选择一个值,然后单击以选择一个完全不同的行,会发生什么?它会发送更改为数据库的ComboBox的数据还是发送所选行中ComboBox的数据? – 2010-05-14 16:48:33

1

您DataGrid的单击事件添加了一个名为myGrid_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; 
     } 
    } 
} 
+0

感谢您的回应。我可能用我的最初的问题措辞不佳,因为我的情况与平均水平不同。如果存储在myData中的对象只包含为ComboBox选择的值,那么您建议的内容看起来会有效。在我的情况下,我的ArrayCollection中的每个对象中的DataField2_Array属性实际上都包含一个我用作comboBox的dataProvider的Array。 DataGrid中每行的ComboBox可以有一组完全不同的选项可供选择。 – 2010-05-14 16:41:39