Flex DataGrid双击编辑单元格
2012-04-20 17:00
197 查看
flex中的DataGrid是支持单击编辑单元格内容的,不过这确实不够方便,单击是选中数据的,怎么能变成修改呢!在网上查了看,利用一个DataGrid组件,可以实现双击修改
此组件源码为:
DoubleClickDataGrid.as
代码如下:
package
{
import flash.events.MouseEvent;
import mx.controls.DataGrid;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.controls.listClasses.IDropInListItemRenderer;
import mx.controls.listClasses.IListItemRenderer;
import mx.core.EventPriority;
import mx.events.DataGridEvent;
/**
* DataGrid that only allows editing if you double click
*/
public class DoubleClickDataGrid extends DataGrid
{
public function DoubleClickDataGrid()
{
super();
doubleClickEnabled = true;
}
override protected function mouseDoubleClickHandler(event:MouseEvent):void
{
var dataGridEvent:DataGridEvent;
var r:IListItemRenderer;
var dgColumn:DataGridColumn;
r = mouseEventToItemRenderer(event);
if (r && r != itemEditorInstance)
{
var dilr:IDropInListItemRenderer = IDropInListItemRenderer(r);
if (columns[dilr.listData.columnIndex].editable)
{
dgColumn = columns[dilr.listData.columnIndex];
dataGridEvent = new DataGridEvent(DataGridEvent.ITEM_EDIT_BEGINNING, false, true);
// ITEM_EDIT events are cancelable
dataGridEvent.columnIndex = dilr.listData.columnIndex;
dataGridEvent.dataField = dgColumn.dataField;
dataGridEvent.rowIndex = dilr.listData.rowIndex + verticalScrollPosition;
dataGridEvent.itemRenderer = r;
dispatchEvent(dataGridEvent);
}
}
super.mouseDoubleClickHandler(event);
}
override protected function mouseUpHandler(event:MouseEvent):void
{
var r:IListItemRenderer;
var dgColumn:DataGridColumn;
r = mouseEventToItemRenderer(event);
if (r)
{
var dilr:IDropInListItemRenderer = IDropInListItemRenderer(r);
if (columns[dilr.listData.columnIndex].editable)
{
dgColumn = columns[dilr.listData.columnIndex];
dgColumn.editable = false;
}
}
super.mouseUpHandler(event);
if (dgColumn)
dgColumn.editable = true;
}
}
}
响应事件是itemEditEnd时,不知道怎么得到处理完的对象。只能处理一个字段修改:
//双击修改处理1
private function itemedit(e:DataGridEvent):void
{
var obj:ListTestVO = ListTestVO(e.itemRenderer.data);//获得修改之前的对象
var oldname:String = e.itemRenderer.data.name;//获得修改之前对象的名字
obj.name = e.currentTarget.itemEditorInstance.text;//把修改后的值附给obj
if(oldname!=obj.name){
listTestSvc.update(obj);
}
}
用itemFocusOut事件,倒可以轻松获取修改后的对象,不过不知道如何验证....
//双击修改处理2
private function itemedit(e:DataGridEvent):void
{
var obj:ListTestVO = ListTestVO(e.itemRenderer.data);//获得修改之后的对象
listTestSvc.update(obj);
dg.addEventListener(DataGridEvent.ITEM_EDIT_END,itemedit);
dg.removeEventListener(DataGridEvent.ITEM_EDIT_BEGINNING,itemedit);
}
还有出现一个问题,修改后,你切换一下页面,在你默认选中的列,会变成可修改的状态
此组件源码为:
DoubleClickDataGrid.as
代码如下:
package
{
import flash.events.MouseEvent;
import mx.controls.DataGrid;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.controls.listClasses.IDropInListItemRenderer;
import mx.controls.listClasses.IListItemRenderer;
import mx.core.EventPriority;
import mx.events.DataGridEvent;
/**
* DataGrid that only allows editing if you double click
*/
public class DoubleClickDataGrid extends DataGrid
{
public function DoubleClickDataGrid()
{
super();
doubleClickEnabled = true;
}
override protected function mouseDoubleClickHandler(event:MouseEvent):void
{
var dataGridEvent:DataGridEvent;
var r:IListItemRenderer;
var dgColumn:DataGridColumn;
r = mouseEventToItemRenderer(event);
if (r && r != itemEditorInstance)
{
var dilr:IDropInListItemRenderer = IDropInListItemRenderer(r);
if (columns[dilr.listData.columnIndex].editable)
{
dgColumn = columns[dilr.listData.columnIndex];
dataGridEvent = new DataGridEvent(DataGridEvent.ITEM_EDIT_BEGINNING, false, true);
// ITEM_EDIT events are cancelable
dataGridEvent.columnIndex = dilr.listData.columnIndex;
dataGridEvent.dataField = dgColumn.dataField;
dataGridEvent.rowIndex = dilr.listData.rowIndex + verticalScrollPosition;
dataGridEvent.itemRenderer = r;
dispatchEvent(dataGridEvent);
}
}
super.mouseDoubleClickHandler(event);
}
override protected function mouseUpHandler(event:MouseEvent):void
{
var r:IListItemRenderer;
var dgColumn:DataGridColumn;
r = mouseEventToItemRenderer(event);
if (r)
{
var dilr:IDropInListItemRenderer = IDropInListItemRenderer(r);
if (columns[dilr.listData.columnIndex].editable)
{
dgColumn = columns[dilr.listData.columnIndex];
dgColumn.editable = false;
}
}
super.mouseUpHandler(event);
if (dgColumn)
dgColumn.editable = true;
}
}
}
响应事件是itemEditEnd时,不知道怎么得到处理完的对象。只能处理一个字段修改:
//双击修改处理1
private function itemedit(e:DataGridEvent):void
{
var obj:ListTestVO = ListTestVO(e.itemRenderer.data);//获得修改之前的对象
var oldname:String = e.itemRenderer.data.name;//获得修改之前对象的名字
obj.name = e.currentTarget.itemEditorInstance.text;//把修改后的值附给obj
if(oldname!=obj.name){
listTestSvc.update(obj);
}
}
用itemFocusOut事件,倒可以轻松获取修改后的对象,不过不知道如何验证....
//双击修改处理2
private function itemedit(e:DataGridEvent):void
{
var obj:ListTestVO = ListTestVO(e.itemRenderer.data);//获得修改之后的对象
listTestSvc.update(obj);
dg.addEventListener(DataGridEvent.ITEM_EDIT_END,itemedit);
dg.removeEventListener(DataGridEvent.ITEM_EDIT_BEGINNING,itemedit);
}
还有出现一个问题,修改后,你切换一下页面,在你默认选中的列,会变成可修改的状态
相关文章推荐
- 单元格双击后可编辑,并无刷新提交,更新数据库。
- 在DBGrid中,单击单元格选择整行,双击又可编辑单元格
- ajax模仿Excel,实现双击GridView单元格保存编辑
- 双击单元格变成可编辑的文本框
- 双击单元格变成可编辑的文本框
- 双击单元格变成可编辑的文本框
- jquery easyui datagrid 双击编辑某一个单元格
- 如何实现双击GridView 单元格编辑单元格内容
- 双击单元格变成可编辑的文本框 - 制作过程
- Jquery+ashx 双击bootstarp 中table 的td单元格进行编辑
- 直接编辑Excel 单元格,而不需双击才能输入
- esayui 编辑单元格 双击编辑一个单元格,不是一行,单击其他后,关闭编辑状态,单击双击编辑可以任意调整
- EasyUI DataGrid 双击编辑单元格,保存并且后台数据改变
- [VB.NET]VB2005,DataGridView如何设置当前的单元格里的内容处于编辑状态.
- 使用CMFCOutlookBarPane创建分组控件,禁用双击编辑的功能
- 双击文本框编辑功能代码
- 请教 JTable 里的单元格如何使得双击进入单元格后,单元格的内容处于全选中状态
- VC 双击编辑ListControl中的数据
- <JQuery>双击编辑异步更新
- CListCtrl控件(2)可编辑单元格的CListCtrl控件