这两天在做关于Flex网站应用的项目,使用的开发环境是flash builer4.5,项目中使用了DataGrid组件,器数据源在外部.as文件中。DataGrid中使用了GridItemRenderer来包含LinkButton和Label,但是在编程中发现DataGrid数据源的修改不能改变与之绑定的LinkButton和Label的相关属性,在网上查了很久也没看到相关问题的解决方案,折腾一天之后,还是在官方帮助文档上找到了解决方法。废话不再多说,下面给出详细情况和解决方案。
<s:DataGrid id="dataGrid1" width="100%" height="60%" dataProvider="{arrColl2}">
上面是我使用的DataGrid的一些属性,其中有这样一列<s:GridColumn headerText="状态" dataField="state"/>,当arrColl2中某一个数据对象(如arrColl2[i])的state改变时,使用dataGrid1.invalidateCell(i,2)可以使得“状态”列的相应单元格内容改变(注:2为“状态”这一列的列号)。我感觉invalidateCell挺好用的,于是在下面这一列的改变中,我也同样使用了类似的方法,结果就出问题了。一开始的代码版本如下:
<s:GridColumn dataField="haveRe" headerText="查看报告摘要">
<s:itemRenderer>
<fx:Component>
<s:GridItemRenderer clipAndEnableScrolling="true">
<mx:LinkButton label="查看报告" accentColor="#cdddf3" visible="{data.haveRe}">
</mx:LinkButton>
<s:Label id="mylab1" text="{data.haveRe.toString()}"/>
</s:GridItemRenderer>
</fx:Component>
</s:itemRenderer>
</s:GridColumn>
当我在外部.as文件中修改arrColl2[i].haveRe=true后,使用dataGrid1.invalidateCell(i,3)对“查看报告摘要列”进行更新时,LinkButton的visible依然是false。在查了很久之后才发现,原来GridItemRenderer内容的改变需要重写prepare()方法,在根据官方文档做了相应修改之后,代码如下:
<s:GridColumn dataField="haveRe" headerText="查看报告摘要">
<s:itemRenderer>
<fx:Component>
<s:GridItemRenderer clipAndEnableScrolling="true">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
override public function prepare(hasBeenRecycled:Boolean):void
{
if(data!=null)
{
try{
if(data.haveRe)
{
mylink1.visible=true;
mylab1.text = "true";
}
}
catch(e:Error)
{
Alert.show("出错了……"+e.toString());
}
}
}
]]>
</fx:Script>
<mx:LinkButton id="mylink1" label="查看报告" accentColor="#cdddf3" visible="false">
</mx:LinkButton>
<s:Label id="mylab1" text="false"/>
</s:GridItemRenderer>
</fx:Component>
</s:itemRenderer>
</s:GridColumn>
运行后达到了我想要的效果。
好的,情况讲述就到这里了,重写prepare及invalidateCell的使用请参看官方文档:http://help.adobe.com/zh_CN/FlashPlatform/reference/actionscript/3/spark/components/gridClasses/GridItemRenderer.html#propertySummary和http://help.adobe.com/zh_CN/FlashPlatform/reference/actionscript/3/spark/components/DataGrid.html。