0

我遇到了一个有趣的一个,认为这是值得发布:AdvancedDataGrid问题(错误?) - 错误列中的披露图标。 (分层数据,Flex 3.5)

我在使用高级数据网格的情况下,我必须设置数据提供者在运行时使用分层数据。 Adobe的文档并没有真正涵盖这种事情(至少不是我可以挖掘到的级别)。

有没有人遇到过这个?

我唯一能想出来的东西有点冒失鬼,似乎引入了高级网格的披露图标的一些奇怪的行为。我在下面列出了测试案例:

advancedDataGridProblem.as:

import mx.collections.ArrayCollection; 

public var dataProvider:ArrayCollection = new ArrayCollection([{label:"item1"}, 
      {label:"item2", children:[{label:"subItem1"},{label:"subItem2"}, 
      {label:"subItem3"}]}, 
      {label:"item3"}]); 

public function init():void{ 
     //using callLater to ensure that the grid has been created before setting DP 
     this.callLater(setDataProvider,[dataProvider]); 
} 

public function setDataProvider(list:ArrayCollection):void{ 
     heirData.source = list; 
} 

和MXML:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"> 
    <mx:Script source="advancedDataGridProblem.as"/> 


    <mx:AdvancedDataGrid id="advDG" width="100%"> 

    <mx:columns> 
     <mx:AdvancedDataGridColumn headerText="What the heck?"/> 
     <mx:AdvancedDataGridColumn headerText="Label" dataField="label"/> 
     <mx:AdvancedDataGridColumn headerText="Column 2"/> 
     <mx:AdvancedDataGridColumn headerText="Column 3"/> 
    </mx:columns> 

    <mx:dataProvider> 
     <mx:HierarchicalData id="heirData"/> 
    </mx:dataProvider> 
</mx:AdvancedDataGrid> 

</mx:Application> 

正如你可以看到,当你运行测试程序,它应该图标在Label栏中显示的内容实际上放置在“What the heck?”柱。如果您拖动标签列并试图将其与“什么?”交换。列中,图标保留在原来的位置,但奇迹般地,之前为标签列左对齐的标签现在已针对图标进行了适当的格式化。将标签列拖出插槽1将使网格恢复原始状态。

这是一个高于我的头 - 任何人有任何建议吗?

理想情况下,我想绕过这个黑客一起,只是在运行时按照惯例分配dataProvider。

在此先感谢!

我将很快用Adobe提交一份关于此问题的错误报告,并将该链接引入评论。

回答

0

要解决的显示图标的问题上面提到的,你可以指定在AdvancedDataGrid的“treeColumn”属性,传递列的ID,你的树数据应该英寸

显然我是盲人前些天在看居民。

干杯!

0

嗯..

一个周末后给我的头摇一摇和一对新鲜的眼光今天,我发现我的问题的“易”部分的解决方案。

直接设置AdvancedDataGrid的dataProvider比我原先想象的简单得多;您只需将ArrayCollection强制转换为HierarchicalData。说实话,我曾尝试过,但拼写层次不正确。facepalm

总之,advancedDataGridProblem.as应改为:

import mx.collections.ArrayCollection; 
import mx.collections.HierarchicalData; 

public var dataProvider:ArrayCollection = new ArrayCollection([{label:"item1"}, 
                   {label:"item2", children:[{label:"subItem1"},{label:"subItem2"}, 
                   {label:"subItem3"}]}, 
                   {label:"item3"}]); 

public function init():void{ 
    //using callLater to ensure that the grid has been created before setting DP 
    this.callLater(setDataProvider,[dataProvider]); 
} 

public function setDataProvider(list:ArrayCollection):void{ 
    advDG.dataProvider = new HierarchicalData(list); 
} 

的dataProvider在MXML声明也可以去掉:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"> 
<mx:Script source="advancedDataGridProblem.as"/> 


<mx:AdvancedDataGrid id="advDG" width="100%"> 

<mx:columns> 
    <mx:AdvancedDataGridColumn headerText="What the heck?"/> 
    <mx:AdvancedDataGridColumn headerText="Label" dataField="label"/> 
    <mx:AdvancedDataGridColumn headerText="Column 2"/> 
    <mx:AdvancedDataGridColumn headerText="Column 3"/> 
</mx:columns> 
</mx:AdvancedDataGrid> 

</mx:Application> 

运行这段代码,你仍然可以看到在错误的列中披露图标,但至少会删除将网格的dataProvider设置为mxml的'hackish'解决方案。这样做也允许适当的验证和网格的显示。设置网格的dataProvider允许正确的显示验证,明显地设置它的dataProvider的分层数据的源代码不会调用这些相同的验证方法,要求用户调整网格或程序员的大小以强制验证以某种方式进行验证(对于我来说,我无法做)。

我会随时为您披露披露图标问题。与此同时,我期望锁定第一列并将其仅用于这些图标在我的应用程序中可以做得很好。我甚至可能把这个'缺陷'变成'特征':P

干杯!

[编辑]

另一个,其允许更容易实现和更少的业务逻辑在使用绑定数据是这样的方法:

advancedDataGridProblem.as:

import mx.collections.ArrayCollection; 
import mx.collections.HierarchicalData; 

public var dataProvider:ArrayCollection = new ArrayCollection([{label:"item1"}, 
                   {label:"item2", children:[{label:"subItem1"},{label:"subItem2"}, 
                   {label:"subItem3"}]}, 
                   {label:"item3"}]); 

的MXML:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
<mx:Script source="advancedDataGridProblem.as"/> 


<mx:AdvancedDataGrid id="advDG" width="100%"> 

<mx:columns> 
    <mx:AdvancedDataGridColumn headerText="What the heck?"/> 
    <mx:AdvancedDataGridColumn headerText="Label" dataField="label"/> 
    <mx:AdvancedDataGridColumn headerText="Column 2"/> 
    <mx:AdvancedDataGridColumn headerText="Column 3"/> 
</mx:columns> 

<mx:dataProvider> 
    <mx:HierarchicalData source="{dataProvider}"/> 
</mx:dataProvider> 

</mx:AdvancedDataGrid> 

</mx:Application> 

此方法避免了在ActionScript中设置网格的dataProvider后,必须手动使网格的列表,显示列表等无效和验证的可能问题。我使用这种方法的一个小小的保留是,因为这在flex 3中创建了单向绑定,我不确定是否可以使用HierarchicalData对象的方法来更改绑定的ArrayCollection。也就是说,我没有在HierarchicalData或AdvancedDataGrid的源代码中使用过,但我不会怀疑它们会直接改变源代码。我会在结果发布后发布。

干杯!