【发布时间】: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 尝试将该字符串作为数组读取,但它崩溃了。我能够获取 typeof 和 col 数据字段并将其转换为数组(如果它是字符串),但我不应该这样做。
我需要让它在创建 itemEditor 的实例时仅显示该特定行和列的单元格值。当该值发生更改时,我需要将其应用回 dataProvider 的 .col 数组中该列的索引。因此,类似于它在 labelFunction 中显示信息的方式,我需要编辑信息并将其发送回。
我见过很多用于 GridColumns 的自定义 itemEditor 和 itemRenderers,但这些都是硬编码在 MXML 中的。我的网格几乎完全是动态创建的,所以很遗憾这不是我的选择,因为我什至不知道创建 DataGrid 时会有多少列或行。我尝试使用 rendererIsEditor,但这似乎只在 GridColumn 的 MXML 实例化上,因为 ActionScript 中只有 rendererIsEditable,而且它似乎不起作用(或者我不知道如何按预期使用它)。
如果有人知道实现此目的的方法,即使只是我应该看的其他东西,我将不胜感激!
【问题讨论】:
标签: apache-flex datagrid flex4 flash-builder flex-spark