2013-03-11 32 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"/>