原创内容,如需转载,请注明出处,谢谢
最近在项目中发现Flex的DataGrid不支持内容复制,在涉及到保护敏感数据时倒是很有用处,但大部分情况下,我们还是希望客户能够直接复制DataGrid单元格中的内容进行快速操作,这个与用户体验背道而驰的问题一定要解决,因此想到直接自定义DataGrid的项呈现器来实现。
呆毛如下:
本来以为可以非常顺利,哪知居然给我碰到了一个BUG,网上查了查,也有不少童鞋们碰到了这个问题,不过似乎都没有有效的解决方案,这个主要是思维固化了,总认为官方的就一定是正确的。
FlashBuilder自定义DataGrid的项呈现器,默认代码就存在问题,即使什么都不改,运行时也会出现错误:
override public function prepare(hasBeenRecycled:Boolean):void
{
lblData.text = data[column.dataField];
}
上面的默认代码一执行就会报错,问题就在于spark的项呈现器是提前生成好的,可重复使用来呈现数据,那么,当一个DataGrid创建时,会自动创建呈现器,尽管此时并没有数据(data=null),那么就会出现问题,data为空的情况下使用data[...]必然报错,所以以上的代码应改为:
override public function prepare(hasBeenRecycled:Boolean):void
{
if(super.data)
{
lblData.text = super.data[column.dataField];
}
}
好了,解决了这个BUG,再来实现我的主要需求吧,为了能够复制单元格的内容,很明显必须将默认呈现器的Label组件替换成TextBase一类支持复制粘贴的组件,这里我使用的是RichEditableText组件,这个组件外观和Label几乎一样,唯一的问题在于可以修改内容,这个难不倒大家,直接editable=false关闭编辑功能即可,一行代码完工:
<s:RichEditableText id="lblData" left="7" top="9" right="0" focusedTextSelectionColor="0xFFFF66" editable="false" doubleClick="lblData.selectAll()" />
任务达成,代码量简洁,放上来倒是不费力,最近一段时间写的组件实在是代码量太大,要放上来得花很多精力组织文章的结构,光想想就放弃了,我想这估计也是阻碍Flex推广的一个很大的问题所在。