2014-02-25 26 views
1

我有一个可编辑的Flex火花DataGrid两列。参数和值。 我被要求更改数据网格,使得第一列参数只能设置为来自设置数据列表的值。如何基于同一行中的另一个下拉列表设置数据提供者?

值的第二列也必须设置为基于下拉框的离散值,该下拉框基于参数列中的值。

如何设置值列的数据提供者,使其取决于参数列中的所选项目?

**请注意,这里提供的代码是简化的,在我的实际代码中,我将项目渲染设置为不同的类。但是,如果我必须这样做才能使数据可用,那么我会以内联方式进行操作。

<s:columns> 
     <s:ArrayList> 
      <s:GridColumn minWidth="100" dataField="parameter" headerText="Parameter" rendererIsEditable="true"> 
       <s:itemRenderer> 
        <fx:Component> 
         <s:GridItemRenderer> 
          <fx:Script> 
         <![CDATA[ 
           import spark.events.IndexChangeEvent; 

           protected function onParamDropListChange(event:IndexChangeEvent):void { 
            var value:String = (event.currentTarget as DropDownList).selectedItem; 
            data[column.dataField] = value; 
                     } 
           ]]> 
        </fx:Script> 

          <s:DropDownList id="paramDownList" requireSelection="true" width="100%" 
              labelField="name"  
              dataProvider="{outerDocument.loadedParamList}" 
              change="onParamDropListChange(event)"> 
          </s:DropDownList> 

         </s:GridItemRenderer> 
        </fx:Component> 
       </s:itemRenderer> 
      </s:GridColumn> 


      <s:GridColumn minWidth="200" dataField="value" headerText="Value" rendererIsEditable="true"> 
       <s:itemRenderer> 
        <fx:Component> 
         <s:GridItemRenderer> 
          <fx:Script> 
         <![CDATA[ 
           import spark.components.DataGrid; 
           import spark.events.IndexChangeEvent; 

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

           ]]> 
        </fx:Script> 

          <s:DropDownList id="ValueDownList" requireSelection="true" width="100%" 
              labelField="values" 
              dataProvider="{SOME_REFERENCE_TO_THE_PARAM_COLUMN_VALUE}" 
              change="onValueDropListChange(event)"> 
          </s:DropDownList> 

         </s:GridItemRenderer> 
        </fx:Component> 
       </s:itemRenderer> 

这里是参数和它们的可能值的一个例子。

{"params": [ 
    {"name": "event_group",   "values": ["CLIENTS", "SERVERS"]}, 
    {"name": "event_sub_group",  "values": ["LOADING", "MACHINE_LOADING"]}, 
    {"name": "environment",   "values": ["stage", "production"]} 
    ] 
    } 

因此,如果用户选择了在PARAMS列一行“event_group”,我希望用户只能够选择在同一行的“客户”或“服务器”,在值列。一旦选定,该值就会被更新并传播到相关对象。

回答

1

所以这是一个想法,我先试试,如果我必须解决这个问题,所以我不知道这是否会奏效。(这可能需要一些工作)

我想,你可以创建一个类来重新传输要在数据网格中显示的数据。所以这个类将有2个ArrayCollection类型的字段,它们将它们绑定到下拉列表。 当用户更改某些下拉菜单时,下拉数据会更新,这将触发数据网格更新。 所以我的想法是两个部分的视图和模型来分割你的代码,

class MyData{ 
//you dhould make all fields bindable 
public var selectedParam:String; 
public var selectedValue:String; 
public var allParams:ArrayCollection; 
public var allValues:ArrayCollection; 
//call this method when selectedParam is changed (you should make it a getter/setter and call update in the setter) 
function updateValues():void{ 
    //update the allValues by checking the selectedParam 
} 
} 

编辑: 当您设置selectedParam则触发将填充allValues收集与正确的价值观updateValues(你生成它们,或者如果可能的值来自Set,则可以用正确的值替换当前的ArrayCollection) EDIT2: 您为每行创建此类的实例并将其添加到ArrayCollection中,然后将ArrayCollection设置为dataProvider格。

+0

嗯,听起来像我没有使关系清晰。每组参数都有一组可能的值。 即使我修改了这个,我将如何将选定参数的值列表返回给数据提供者或每一行? – Bob

+0

我一定错过了一些东西。如何将这个类的实例设置为每一行? – Bob

+0

现在更有意义了,谢谢,我会试试。 – Bob

相关问题