截取值传递给项目编辑器?

时间:2011-12-28 18:00:59

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

我试图拦截从DataGrid的GridColumn的itemRenderer获取并应用于itemEditor的值,反之亦然。我需要能够格式化这个值。但是,我的项目很复杂,所以我可能会关注我想要完成的错误想法。如果还有其他我可以尝试的话,请看看并告诉我。

我有一个Spark DataGrid组件(ID dg ),我从XML动态填充。我从一些节点创建一个ArrayCollection,从子节点创建一个常规Array,作为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”dataField,它对应于 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 dataField的整个数组,将该数组转换为字符串,并显示整个编辑文本框中的字符串。如果我取消编辑或保存编辑,则会将字符串设置为 .col 属性。然后 labelFunction 尝试将该字符串作为数组读取,然后崩溃。我能够获得 typeof col dataField并将其转换为数组,如果它是一个字符串,但我不应该这样做。

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

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

如果有人知道如何做到这一点,即使只是我应该看的其他东西,我会非常感激!