【问题标题】:mx:Datagrid not displaying booleans correctlymx:Datagrid 未正确显示布尔值
【发布时间】:2011-07-08 12:21:01
【问题描述】:

我在使用 datagrid itemRenderers 时遇到了一些相当古怪的行为。
首先,我创建一个 ArrayCollection,如下所示:

[Bindable]
private var myBooleans:ArrayCollection = new ArrayCollection([false,true]);

然后我将它绑定到数据网格:

<mx:DataGrid dataProvider="{myBooleans}" width="100%" height="100%">
    <mx:columns>
        <mx:DataGridColumn 
            xmlns:mx="library://ns.adobe.com/flex/mx"
            headerText="Value"
            editorDataField="selected"
            rendererIsEditor="true"
            itemRenderer="mx.controls.CheckBox"
            >
        </mx:DataGridColumn>
    </mx:columns>
</mx:DataGrid>

运行时,如果布尔值 == true,数据网格仅显示具有正确 itemRenderer 的行。
对于 boolean == false 的行,它将显示一个空行。

我还想补充一点,将布尔值包装在包装器对象中不会因我的用例而减少它,因为我将通过 RPC 调用接收未包装的布尔值的 ArrayCollection。

干杯

【问题讨论】:

  • 你为什么要为单列使用数据网格?为什么不是列表?
  • @J_A_X,因为默认的排序机制会很方便。不过,将不得不走 List 路径,并且可能暂时放弃排序。
  • 使用 Array 或 ArrayCollection 很容易完成排序。
  • 确实如此,肯定会去列表。

标签: apache-flex datagrid itemrenderer


【解决方案1】:

Flex SDK 3.6; DataGridBase 的第 1070-1071 行是这样的:

    if (item is IDropInListItemRenderer)
        IDropInListItemRenderer(item).listData = data ? rowData : null;

基本上,由于您的数据对象为 false,因此会为 listData 发送空值。我猜这会导致阻止渲染器渲染的链式反应。值得庆幸的是,setupColumnItemRenderer 方法受到保护,因此您可以尝试扩展 DataGrid。

我还注意到,渲染器中的数据更改事件似乎永远不会为 dataProvider 中的“假”项执行。这是出乎意料的。

我花了大约 30 分钟的时间遍历代码才找到这一行,我不相信我有 100% 的“答案”。

【讨论】:

  • 我刚试过,你是对的!虽然,我认为此时他可能更容易继续对从 RPC 调用返回的值进行循环并将它们设置在适当的对象中......即使他说他不想这样做那个。
  • 我注意到整数也会发生这种情况。如果您创建一个 [0,1] 数组并使用普通的 DataGridColomn,则 DataGrid 还将显示 2 行,其中一行是空的。当然是data == 0的那一行
  • @DennisJaamann 我很确定这条线也是整数的罪魁祸首。
  • @Jonathan Rowny。如前所述,包装这是不行的。我在我的 DataGrid 中表示服务器存储的对象状态,并将为巨大的对象树提供一个 flex 编辑器。这意味着我想这样显示数据,并且我不想引入很多额外的步骤来表示对象状态,然后再引入更多步骤来保存修改后的对象状态。
猜你喜欢
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多