当我在数据网格中的某一行上输入时,我试图运行以下代码,当我点击该行(ListEvent)时它会起作用但是当我按下回车键时如何启用它(的KeyboardEvent)。我有输入键工作,虽然每次都会抛出此错误
Main
答案 0 :(得分:0)
问题是您正在为网格分配一个键侦听器,因此在此上下文中没有特定项。每当按下一个键时,keyDown
事件就会触发,并且网格中的任何位置 。你想要itemKeyDown
之类的东西,但是网格似乎没有为你提供这样的事件。
这就是为什么我要求您检查Event/target
以查看其包含的值。如果项呈示器具有焦点并且用户按下某个键,则会触发您的处理程序,您可以检查事件target
是否为项呈示器,即if(event.target is AdvancedDataGridItemRenderer)
。 (事件currentTarget
将永远是网格。)现在,我对AdvancedDataGrid
项呈现的实现不是很熟悉,但事件target
本身可能不是项呈示器,只是项呈示器的子项(例如项呈示器中的文本字段)。要检查target
是否 ,可以通过遍历显示树并检查父项is
是否为项呈示器类来实现项呈示器:
function findItemRenderer(object:DisplayObject):AdvancedDataGridItemRenderer {
var current:DisplayObject = object;
while(current && !(current is AdvancedDataGrid)){
if(current is AdvancedDataGridItemRenderer)
return current as AdvancedDataGridItemRenderer;
current = current.parent;
}
return null;
}
现在您可以像这样处理您的活动:
function gridKeyDown(e:KeyboardEvent):void {
var item:AdvancedDataGridItemRenderer = findItemRenderer(e.target as DisplayObject);
if(item){
// do stuff with your item
}
}
但是像这样搜索显示层次结构有点愚蠢。您应该做的只是从项目渲染器内部发送事件,以便事件目标始终是项目渲染器本身。例如:
class MyItemRenderer extends AdvancedDataGridItemRenderer {
public static const ITEM_ENTER:String = "itemEnter";
public MyItemRenderer(){
addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
}
private function keyDown(e:KeyboardEvent):void {
if(e.keyCode == Keyboard.ENTER)
dispatchEvent(new Event(ITEM_ENTER, true)); // bubbles=true
}
}
现在您可以处理此事件:
myGrid.addEventListener(MyItemRenderer.ITEM_ENTER, itemEnter);
function itemEnter(e:Event):void {
var item:MyItemRenderer = e.target as MyItemRenderer;
// do stuff with your item
}