您的位置:首页 > 其它

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);

}

还有出现一个问题,修改后,你切换一下页面,在你默认选中的列,会变成可修改的状态
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息