在Flex Datagrid中动态填充comboBox提供程序

时间:2015-05-18 14:57:28

标签: actionscript-3 flex combobox actionscript

我正在尝试动态地将comboBox添加到DataGrid,并且对于每个comboBox,我期望一个唯一的dataProvider。例如,我建立了一个网格如下:

<s:DataGrid id="testGrid"
            horizontalCenter="0"
            width="100%"
            dataProvider="{testArr}"
            gridClick="handleTestGridClick(event)">
    <s:columns>
        <s:ArrayList>
            <s:GridColumn dataField = "valName" headerText="Name"/>
            <s:GridColumn dataField = "testVals" headerText="Selections>
                <s:itemRenderer>
                    <fx:Component>
                        <s:GridItemRenderer>
                            <s:ComboBox id="foo" width="300" dataProvider="{data.testVals}"/>
                        <s:GridItemRendeder>
                    </fx:Component>
                </s:itemRenderer>
        </s:ArrayList>
    </s:columns>
</s:DataGrid>

在我的actionscript中,我有一个HTTPService函数,它返回以下列方式格式化的JSON数据:

my $store = { "valName"  => $$data[$i][0], #a string
              "testVals" => [@arr]} #array of strings

来自HTTPService的结果处理程序:

private function handleResults(event:ResultEvent):void
{
   var str:String = String(event.result);
   var temp:Object = JSON.parse(str);
   testArr = new ArrayCollection(ArrayUtil.toArray(temp));
}

当我尝试填充网格时,第一列将显示&#34; valName&#34;(s)我期望但是comboBox仍为空。使用gridClick事件显示所选行的dataProvider会显示以下内容(请注意此更改取决于我的提供程序,但始终显示正确的数据):

(Object)#0
  testVals=(Array)#1
   [0] "test1"
   [1] "test2"
  valName = "Blah"

任何人都可以向我提供有关如何让testVal数组实际显示在comboBox中的一些提示,反馈等吗?

2 个答案:

答案 0 :(得分:1)

you should get the testVals array from tmp object like this :

private function handleResults(event:ResultEvent):void
{
   var str:String = String(event.result);
   var temp:Object = JSON.parse(str);
   if(temp.testVals){
     testArr = new ArrayCollection(ArrayUtil.toArray(temp.testVals));
   }
}

答案 1 :(得分:1)

不确定你是如何在这里得到异常的,但是testVals属性应该是一个ArrayCollection来成为数据提供者而不是数组?

试试这个,我很确定它应该有效:

var itemOne:Object = {};
itemOne.valName = "Item one";
itemOne.testVals = new ArrayCollection(["one", "two"]);

var itemTwo:Object = {};
itemTwo.valName = "Item two";
itemTwo.testVals = new ArrayCollection(["three", "four"]);

testArr = new ArrayCollection([itemOne, itemTwo]);

基本上,你需要在获得数据后将所有testVals从Array转换为ArrayCollection:

private function handleResults(event:ResultEvent):void
{
   var str:String = String(event.result);
   var temp:Object = JSON.parse(str);
   testArr = new ArrayCollection(ArrayUtil.toArray(temp));

   for (var i:int = 0; i < testArr.length; i++)
   {
       var item:Object = testArr[i];
       item.testVals = new ArrayCollection(item.testVals);
   }   
}