我试图拦截从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 ,它似乎不起作用(或者我不知道如何按预期使用它。
如果有人知道如何做到这一点,即使只是我应该看的其他东西,我会非常感激!
答案 0 :(得分:0)