我正在尝试实现以下功能:
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?
}
答案 0 :(得分:3)
如果没有数据,则不会有任何行或itemRenderer,因此从技术上讲,没有行索引。 e.target
将包含ListBaseContentHolder
,e.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,宽度,高度属性)。
让我知道什么有效。