实现Flex DataGrid 可以复制整行值的 itemRenderer

几个关键点:

  • 实现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);
			}
		}
	}
}