在 Flex Datagrid 中动态填充组合框提供程序
Dynamically fill comboBox providers in Flex Datagrid
我正在尝试将组合框动态添加到 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 函数,returns 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));
}
当我尝试填充网格时,第一列将显示我期望的 "valName"(s),但组合框仍为空。使用 gridClick 事件显示选定行的 dataProvider 显示以下内容(请注意,这会根据我的提供程序而变化,但始终显示正确的数据):
(Object)#0
testVals=(Array)#1
[0] "test1"
[1] "test2"
valName = "Blah"
任何人都可以向我提供一些关于如何让 testVal 数组实际显示在组合框中的提示、反馈等吗?
您应该从 tmp
对象中获取 testVals
数组,如下所示:
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));
}
}
不知道你怎么没有在这里得到异常,但 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);
}
}
我正在尝试将组合框动态添加到 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 函数,returns 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));
}
当我尝试填充网格时,第一列将显示我期望的 "valName"(s),但组合框仍为空。使用 gridClick 事件显示选定行的 dataProvider 显示以下内容(请注意,这会根据我的提供程序而变化,但始终显示正确的数据):
(Object)#0
testVals=(Array)#1
[0] "test1"
[1] "test2"
valName = "Blah"
任何人都可以向我提供一些关于如何让 testVal 数组实际显示在组合框中的提示、反馈等吗?
您应该从 tmp
对象中获取 testVals
数组,如下所示:
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));
}
}
不知道你怎么没有在这里得到异常,但 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);
}
}