2010-05-12 111 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