【问题标题】:Intercept value passed to item editor?拦截值传递给项目编辑器?
【发布时间】:2011-12-28 18:00:59
【问题描述】:

我试图截取取自 DataGrid 的 GridColumn 的 itemRenderer 并应用于 itemEditor 的值,反之亦然。我需要能够格式化这个值。然而,我的项目很复杂,所以我可能会专注于我想要完成的错误想法。请看一下,如果我可以尝试其他方法,请告诉我。

我有一个从 XML 动态填充的 Spark DataGrid 组件(ID dg)。我从一些节点创建一个 ArrayCollection,并从子节点创建一个常规数组,作为 ArrayCollection 的属性添加。然后将该 ArrayCollection 用作 DataGrid 的 dataProvider。

这是一个典型 XML 节点及其子节点的示例片段:

<item name="physOrderTable" text="" type="notes">
    <cols>
        <col id="0" text="Day/Time" />
        <col id="1" text="Order Type" />
        <col id="2" text="Physician's Orders" />
        <col id="3" text="Physician's Signature" />
    </cols>
    <rows>
        <row id="r0" name="" text="">
            <col id="0"><![CDATA[Tues 15:24]]></col>
            <col id="1"><![CDATA[General]]></col>
            <col id="2"><![CDATA[BMP, CBC, Cardiac Enzymes, ABG, EKG STAT, NS@ 125 mL/hr, Blood Sugar AC & HS, 02 via NC to keep oxygen saturation above 97%]]></col>
            <col id="3"><![CDATA[J. Nelms]]></col>
        </row>
    </rows>
</item>

下面是读取 XML 并使用它的代码:

protected function sparkDG_creationCompleteHandler(event:FlexEvent):void
{
    trace("grid created");
    var colsList:XMLList = xml.cols.col;
    var rowsList:XMLList = xml.rows.row;
    colAL = new ArrayList();

    for(var i:Number = 0; i < colsList.length(); i++)
    {
        var gc:GridColumn = new GridColumn();
        gc.maxWidth = 500;
        gc.resizable = false;
        gc.headerText = String(colsList[i].@text);
        gc.dataField = "col";
        gc.labelFunction = labelFunc;
        colAL.addItem(gc);
    }

    for each(var row:XML in XML(value).rows.children())
    {
        var rowArr:Array = new Array();

        for each(var col:XML in row.children())
        {
            if(col == "")
            {
                rowArr[Number(col.@id)] = "_";
            }else{
                rowArr[Number(col.@id)] = col;
            }
        }

        colAC.addItem({
            rowID: row.@id,
            rowName: row.@name,
            rowText: row.@text,
            col: rowArr
        });
    }

    dg.columns = colAL;
    dg.dataProvider = colAC;
}//

所以我首先为 DataGrid 构建标题,告诉它使用“col”数据字段,它对应于 colAC ArrayCollection 的 .col 属性。 .col 属性是该行的每个单元格的值数组。

现在这部分代码很重要,因为它使用 .columnIndex 显示 .col 数组的相关索引:

private function labelFunc(item:Object, column:GridColumn):String
{
    var displayText:String;
    var valArr:Array = new Array();

    if(column.dataField == "col")
    {
        valArr = item[column.dataField];
        displayText = String(valArr[column.columnIndex]);
    }

    return displayText;
}//

这是我能够用来达到预期结果的唯一方法。如果我只想显示信息,这一切都很好。但我需要能够编辑每个单元格中的值,并将其应用回 dataProvider,因为稍后我需要使用更新的值重建 XML。

我已经尝试了所有我能想到的方法来做到这一点。我构建了自己的 itemRenderer,然后构建了自己的 itemEditor,然后废弃了它们,因为感觉就像我在重新发明轮子。但我是吗?我尝试通读 DataGrid、GridColumn 和相关类的代码,但除了 IFactory 之外,我找不到对 itemEditor 的任何引用。我不知道它在哪里或如何告诉 IFactory 是一个文本输入或任何它。

这是我的问题:

当我打开 DataGrid 的编辑并双击一个单元格时,它将获取该列单元格的 col 数据字段的整个数组,将该数组转换为字符串,并显示整个编辑文本框中的字符串。如果我取消编辑或保存编辑,它会将 string 设置为 .col 属性。然后 labelFunction 尝试将该字符串作为数组读取,但它崩溃了。我能够获取 typeofcol 数据字段并将其转换为数组(如果它是字符串),但我不应该这样做。

我需要让它在创建 itemEditor 的实例时显示该特定行和列的单元格值。当该值发生更改时,我需要将其应用回 dataProvider 的 .col 数组中该列的索引。因此,类似于它在 labelFunction 中显示信息的方式,我需要编辑信息并将其发送回。

我见过很多用于 GridColumns 的自定义 itemEditor 和 itemRenderers,但这些都是硬编码在 MXML 中的。我的网格几乎完全是动态创建的,所以很遗憾这不是我的选择,因为我什至不知道创建 DataGrid 时会有多少列或行。我尝试使用 rendererIsEditor,但这似乎只在 GridColumn 的 MXML 实例化上,因为 ActionScript 中只有 rendererIsEditable,而且它似乎不起作用(或者我不知道如何按预期使用它)。

如果有人知道实现此目的的方法,即使只是我应该看的其他东西,我将不胜感激!

【问题讨论】:

    标签: apache-flex datagrid flex4 flash-builder flex-spark


    【解决方案1】:
    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多