Flex DataGrid通过单击事件添加新行

时间:2009-11-10 01:58:42

标签: flex datagrid

我正在尝试实现以下功能:

Flex数据网格创建了1个默认行。当用户单击第二行时,需要创建一个新行并使其可编辑。

以下是已经有效的方法 - 用户选项卡在列上,当用户选项卡在最后一列时,会创建一个使用默认值的新行。

这也是已经有效的 - 用户单击网格外的按钮,这会添加一个新行。

(itemEditBegin和itemEditEnd已经实现)

以下是不起作用的:当我在第二行“单击”(没有数据 - 行为空)时,如何检测当前单击的行是否为第二行并使其可编辑?我可以从MouseEvent中找出rowIndex并使用它来添加新行吗?

查找以下代码:

<mx:DataGrid id="myGrid" editable="true" click="clickEvent(event)"
     itemEditEnd="endEdit(event)" itemEditBegin="beginEdit(event)" variableRowHeight="true" >

private function clickEvent(ev:Event):void
{
    var i:Object = MouseEvent(ev).currentTarget;
        // is this the right event?
}

2 个答案:

答案 0 :(得分:3)

如果没有数据,则不会有任何行或itemRenderer,因此从技术上讲,没有行索引。 e.target将包含ListBaseContentHoldere.currentTarget将包含DataGrid本身。但是,您可以使用mouse-y位置来计算单击位置上的行。这是一个肮脏的小技巧 - 它没有经过彻底的测试,因此可能因边缘情况而失败。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
    xmlns:local="*" creationComplete="create();">
    <mx:DataGrid id="myGrid" editable="true" click="clickEvent(event)"
     variableRowHeight="true" >
    <mx:columns>
        <mx:DataGridColumn dataField="d"/>
        <mx:DataGridColumn/>
    </mx:columns>
    </mx:DataGrid>
    <mx:Script>
        <![CDATA[
            import mx.controls.listClasses.ListRowInfo;
            import mx.controls.listClasses.ListBaseContentHolder;
            private function clickEvent(e:MouseEvent):void
            {
                if(!(e.target is ListBaseContentHolder))
                    return;
                var holder:ListBaseContentHolder = 
                    ListBaseContentHolder(e.target);
                var rowIndex:Number = -1;
                var length:Number = holder.rowInfo.length;
                var rowInfo:ListRowInfo;
                for(var i:Number = 0; i < length; i++)
                {
                    rowInfo = holder.rowInfo[i];
                    if(e.localY > rowInfo.y && 
                        e.localY < rowInfo.y + rowInfo.height)
                    {
                        rowIndex = i;
                        break; 
                    }
                }
                trace("Clicked on " + rowIndex);
            }
            private function create():void
            {
                myGrid.dataProvider = [{d:"A"},{d:"B"}];
            }
        ]]>
    </mx:Script>
</mx:Application>

答案 1 :(得分:0)

很棒的问题,DataGrid支持在DataGrid的dataProvider中选择对象。但它不允许轻松选择/ mouseOver没有项目的行(空行)。

1)我要么在DataGrid的末尾添加一个虚拟行,这样DataGrid就可以轻松选择它。
2)否则,我会检查mouseX / mouseY是否在你刚刚点击的空行的参数范围内(使用空行的全局X,Y,宽度,高度属性)。

让我知道什么有效。