我被困住了。
鉴于此XML:
<matrix>
<row>
<column>0.51</column>
<column>0.52</column>
<column>0.53</column>
<column>0.54</column>
</row>
<row>
<column>0.61</column>
<column>0.62</column>
<column>0.63</column>
<column>0.64</column>
</row>
我正在尝试定义一个DataGrid,使得行节点将表示DataGrid中的新行,并且列节点将用于自动填充DataGrid的列。我在为每个创建的DataGridColumn对象设置dataField时遇到问题。创建了DataGrid,但第1行的单元格值均为0.51,第2行为0.61。
我在这里做错了什么?
答案 0 :(得分:1)
我认为绊倒你的是你不能用这种方式定义DataGrid
(至少没有很多改编)。基本上,DataGrid
期望一组对象显示为一组行。
这些列作为dataProvider
中给定对象的特定属性的视图进行播放。 DataGridColumn
将显示与其dataField
属性的值匹配的属性。
因此,下面是一个快速/肮脏的例子。由于某种原因,我在使用XML作为数据源时遇到了麻烦,因此我将数据转换为通用对象 - 这不是我在实际操作中建议的 - 以解释数据网格如何填充列:
<mx:Script>
<![CDATA[
private var data:Array = [
{column0:0.51, column1:0.52, column2:0.53, column3:0.54},
{column0:0.61, column1:0.62, column2:0.63, column3:0.64}
];
private var dataDisplayDP:ArrayCollection = new ArrayCollection(data);
private function dataDisplayerCreationListener():void
{
dataDisplayer.dataProvider = dataDisplayDP;
}
]]>>
</mx:Script>
<mx:DataGrid id="dataDisplayer" creationComplete="dataDisplayerCreationListener()">
<mx:DataGridColumn dataField="column0"/>
<mx:DataGridColumn dataField="column1"/>
<mx:DataGridColumn dataField="column2"/>
<mx:DataGridColumn dataField="column3"/>
</mx:DataGrid>
所以,同样,我们的想法是每行代表dataProvider
中的一个项目,而每一列代表该行所代表的对象的特定属性。这种方法起初可能看起来很奇怪,但它允许您以表格格式直观地表示数据,而不必以表格格式构建数据。
您可以使用Array对象作为数据源,但通常最好将其包装在ArrayCollection对象中 - 当Collection对象用作数据源时,视图组件将在数据更改时自动更新。
同样,您不仅限于使用Array或ArrayCollection作为数据源。来自Flex documentation on dataProvider
:
... [dataProvider属性]允许您将大多数类型的对象用作数据提供者。如果将dataProvider属性设置为Array,则会将其转换为ArrayCollection。如果将属性设置为XML对象,则它将转换为仅包含一个项目的XMLListCollection。如果将属性设置为XMLList,则它将转换为XMLListCollection。如果将属性设置为实现IList或ICollectionView接口的对象,则将直接使用该对象。
顺便说一下,如果您使用Array或XML对象,即使它们将转换为Collection对象,我也非常确保您不会获得自动视图更新的好处。