几个关键点:
- 实现IListItemRenderer 和 IDropInListItemRenderer接口,Label默认已经实现
- 覆盖 data 属性 setter(这个是一行的数据,不是一个单元格的数据)
- (如果需要,本例不需要)通过 listData 属性获得单元格的元数据(dateField,columnIndex 等等)信息
- 通过 owner 属性获得 DataGrid,从而获得所有列的信息
- 根据列信息拼接 data 到字符串
- 通过 Clipboard 把字符串放到操作系统的 Clipboard 里面
- 添加右键上下文菜单
package com.nealmi.ui.lib.itemrenders {
import flash.desktop.Clipboard;
import flash.desktop.ClipboardFormats;
import flash.events.ContextMenuEvent;
import flash.ui.ContextMenu;
import flash.ui.ContextMenuItem;
import mx.controls.Label;
import mx.controls.dataGridClasses.DataGridListData;
import mx.controls.listClasses.BaseListData;
public class CopyableDataGridItemRenderer extends Label {
private var cellValue:String="";
public function CopyableDataGridItemRenderer() {
super();
}
override public function set data(value:Object):void {
if (!value) {
return;
}
super.data=value;
cellValue = "";
//cellValue=data[(this.listData as DataGridListData).dataField];
var pt:mx.controls.DataGrid=listData.owner as mx.controls.DataGrid;
if (!pt)
return;
//拼接该行所有数据为字符串,并且去除无dataField的列(比如趋势按钮列)
for each (var c:mx.controls.dataGridClasses.DataGridColumn in pt.columns) {
if (c.dataField == null || c.dataField == "" || c.dataField == "undefined")
continue;
cellValue+=data[c.dataField] + ",";
}
if (cellValue && cellValue.length > 1) {
//去掉最后一个逗号
cellValue=cellValue.substr(0, cellValue.length - 1);
//设置toolTip
this.toolTip=cellValue;
//添加上下文菜单(右键菜单)
var myMenuItem:ContextMenuItem=new ContextMenuItem("复制该行值");
myMenuItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, copyValueToClipBoard);
var myMenu:ContextMenu=new ContextMenu();
myMenu.hideBuiltInItems();
myMenu.customItems.push(myMenuItem);
this.contextMenu=myMenu;
}
}
override protected function updateDisplayList(w:Number, h:Number):void {
super.updateDisplayList(w, h);
if (textField) {
//文字居中
textField.y=(h - textField.textHeight) * 0.5;
}
}
private function copyValueToClipBoard(e:ContextMenuEvent):void {
if (cellValue) {
Clipboard.generalClipboard.setData(ClipboardFormats.TEXT_FORMAT, cellValue);
}
}
}
}