2015-05-18 4 views
0

Я пытаюсь динамически добавлять comboBox в DataGrid, и для каждого comboBox я ожидаю уникальный dataProvider. Так, например, я построил сетку следующим образом:Динамически заполнять поставщики comboBox в Flex Datagrid

<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)); 
} 

При попытке заполнить сетку первый столбец (s) будет отображать «valName» (с) я ожидаю, но COMBOBOX (а) остается пустым. Использование события gridClick для отображения DataProvider выбранной строке в представлены следующим образом (обратите внимание, это меняется в зависимости от моего провайдера, но всегда показывает правильные данные):

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

Может кто-нибудь дать мне некоторые советы, отзывы и т.д. о том, как чтобы массив testVal отображался в comboBox?

ответ

1

Не знаю, как вы не получаете исключение здесь, но свойство testVals должно быть ArrayCollection стать DataProvider, а не массив?

Попробуйте это, я уверен, что он должен работать:

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 из массива в 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); 
    } 
} 
+0

Я не мог понять, как получить список в объекте dataprovider, чтобы он оставался равным нулю. Ваш ответ сделал трюк. Благодарю. – nope

1

вы должны получить testVals массив из tmp объекта как это:

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)); 
    } 
} 
Смежные вопросы