2013-03-11 50 views
0

我有一個數據網格表,dataGrid表中的gridColumn調用「DropDownListItemRenderer」。使用相同的項目渲染器,我想根據dataField名稱更改下拉列表中的內容。例如,如果dataField名稱是彩色的,那麼下拉菜單將包含紅色,藍色,綠色等。如果dataField名稱是furits,那麼下拉列表將包含不同的水果選項。Flex:如何重用Item渲染器?

如果你看看我的項目渲染器中的代碼。我試圖通過創建一個名爲dropDownListData的可綁定數組集合來完成上述操作。在覆蓋設置數據函數我得到dataField名稱,使用數據字段名稱,我相應地添加數組集合中的項目。

儘管在運行程序時下拉列表中填充了正確的數據。每當選擇下拉列表時,下拉列表中的數據會重複並增加。

我想我沒有使用正確的方法來做到這一點。那麼有人能告訴我我是怎麼做到的?請有人可以幫我解決這個問題嗎?請讓我知道,如果我的問題不明確,我會嘗試重述它。

謝謝:)

這是我的MXML文件:

 <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">  
<fx:Script> 
    <![CDATA[     
     import FrontEndObjects.ColourItems;   
     import mx.collections.ArrayCollection;   
     import spark.events.IndexChangeEvent; 

     [Bindable] 
     private var order:ArrayCollection = new ArrayCollection(); 

     private function addOrder():void{    
      var orderItems:ColourItems = new ColourItems(); 
      order.addItem(orderItems);    
     } 

    ]]> 
</fx:Script>  
<s:BorderContainer x="175" y="101" width="606" height="289"> 
    <s:DataGrid id="myDG" x="53" y="27" width="516" height="201" dataProvider="{order}" 
       editable="true" variableRowHeight="true"> 
     <s:columns> 
      <s:ArrayList> 
       <s:GridColumn dataField="label1" headerText="Order #" editable="true"/>    
       <s:GridColumn dataField="quant" headerText="Qty" editable="true"/>    
       <s:GridColumn dataField="color" headerText="Color" editable="true" rendererIsEditable="true" itemRenderer="myRenderers.DropDownListItemRenderer"/> 
       <s:GridColumn dataField="furits" headerText="Furits" editable="true" rendererIsEditable="true" itemRenderer="myRenderers.DropDownListItemRenderer"/>          
      </s:ArrayList> 
     </s:columns > 
    </s:DataGrid> 
    <s:Button x="499" y="236" label="add" click="addOrder()" /> 
</s:BorderContainer>  

這是我的DropDownList項目渲染:

<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" clipAndEnableScrolling="true">  
<fx:Script> 
    <![CDATA[   
     import mx.collections.ArrayCollection; 
     import mx.controls.Alert;   
     import spark.components.gridClasses.GridColumn; 
     import spark.events.IndexChangeEvent; 
     public var cName:String; 

     [Bindable] 
     private var dropDownListData:ArrayCollection = new ArrayCollection();   

     protected function onCbChange(event:IndexChangeEvent):void 
     { 
      var value:String = (event.currentTarget as DropDownList).selectedItem; 
      data[column.dataField] = value; 
     } 

     override public function set data(value:Object):void 
     { 

      super.data = value; 
      cName = column.dataField; 
      if(cName == "color"){ 
       dropDownListData.addItem("red"); 
       dropDownListData.addItem("blue"); 
       dropDownListData.addItem("green"); 
      } 
      else if(cName == "furits"){ 
       dropDownListData.addItem("banana"); 
       dropDownListData.addItem("apple"); 
       dropDownListData.addItem("grapes"); 
      } 
     }  
    ]]> 
</fx:Script>  
<s:DropDownList id="cb" width="100%" change="onCbChange(event)" requireSelection="true" dataProvider="{dropDownListData}"/>  

這是我的鄂畢JECT類:

public class ColourItems 
{ 
    public var label1:String; 
public var quant:String; 
public var color:String;  
public var furits:String;  
} 
+0

難明白這個代碼,請創建「一個基於文件」的例子 – 2013-03-11 14:39:27

+0

llya嗨! 「一個基於文件」是否意味着把所有內容放在一個MXML文件中?現在,我再次編輯了我的問題以顯示我的所有代碼。你可以複製粘貼代碼並在你的電腦上運行。我有一個MXML文件,一個Item渲染器文件和一個colourItems類。希望這更清楚。請讓我知道我能做些什麼來使我的代碼更加清晰。謝謝:) – user2017147 2013-03-12 12:43:04

回答

0

在的itemRenderer的SetData方法,你應該檢查那些已經存在在列表中的數據做的addItem前

+0

嗨..我怎麼做一個測試,看看它是否已經存在?請問你能舉個例子嗎?我對felx很新穎。 – user2017147 2013-03-19 00:17:20

+0

使用調試模式。這個問題本身實際上會產生更多的問題:-)但是,請查看調試模式下的變量 – Ryan 2013-03-20 16:52:46

0

您設定的目標列作爲編輯:編輯=「真」 rendererIsEditable = 「真正」。當您單擊單元格時,網格調用會在itemrenderer中設置數據(value:Object)方法,您將在下拉列表中添加項目的次數越來越多。你可以很容易解決這個問題,殘障人士可編輯的細胞:

<s:GridColumn dataField="color" headerText="Color" editable="false" itemRenderer="myRenderers.DropDownListItemRenderer"/> 
<s:GridColumn dataField="furits" headerText="Furits" editable="false" itemRenderer="myRenderers.DropDownListItemRenderer"/>