我的应用程序有一个带有自定义项呈现器的树,它根据叶子上的数据类型使用不同的组件作为编辑器。在一种情况下,我试图使用一个数据网格,以便用户可以选择一行,满足他的需求(几列需要显示),即。在概念上与ComboBox类似。
要做到这一点,我有一个函数分配为'itemEditBegin'(对于树)的处理程序,我在其中动态创建数据网格,然后使用弹出式管理器将其显示为(模态)弹出。到目前为止一切顺利。
但是,如果您单击任何地方(例如:在数据网格中向下滚动按钮),弹出窗口消失,因为itemEditEnd事件被触发-为什么?!
在另一个场景中,我将DateField设置为编辑器,用户可以单击图标以打开DateChooser,滚动月份等。我看了看这背后的代码,它是使用一个弹出窗口,似乎在我的代码完全相同的方式!
下面是'itemEditBegin'代码:
dataGrid = new DataGrid();
dataGrid.dataProvider = mddTable.dataCollection;
dataGrid.editable = false;
PopUpManager.addPopUp(dataGrid, this, true);
,其中'this'是树渲染器对一行使用的组件。它是树组件的"itemEditEnd"处理程序,一旦数据网格内的任何东西被点击(例如)就会被调用。一个行,向下滚动按钮,列分隔符等)。
有什么想法吗?
谢谢,
迈克。
我想我必须看到代码,或者在实践中工作才能完全理解。当您将DataGrid用作itemEditor时,听起来好像单个DataGrid列是可编辑的。对吗?
当您将焦点从DataGrid中的itemEditor移开时,它将触发itemEditEnd事件。你的树一定会对此做出反应。尝试在DataGrid类中停止事件传播。概念上是这样的:
<mx:DataGrid>
<mx:Script>
public function oItemEditEnd(event:DataGridEvent):void{
event.stopPropogation();
}
</mx:Script>
<mx:columns>
<mx:DataGridColumn itemEditEnd="onItemEditEnd(event)">
<mx:DataGridColumn itemEditEnd="onItemEditEnd(event)">
</mx:columns>
</mx:DataGrid>
如果您这样做,您将不得不做一些事情来确定用户何时完成编辑并手动关闭itemEditor。
关于stoppropagation()的更多信息…还要检查stopimmediatepropagation()。我不确定您需要哪一个,因为这取决于您的代码的结构。
最终我找到了一个解决方案,可以更轻松地解决这个问题。只需添加一行:
dataGrid.owner = this;
解决了过早的itemEditEnd事件问题。然而,现在我有相反的问题,其中itemEditEnd事件不会被触发,直到我点击树的另一行!
我在数据网格上有一个'item clicked'侦听器,当其中一个值被单击时,它会破坏数据网格,但只是这样做不会导致底层树行的itemEditEnd事件触发。我在文档中读到组件失去焦点导致它,所以我调度了我自己的'FocusEvent。FOCUS_OUT事件-不好。
如果我手动将焦点更改为底层树,itemEditEnd事件会触发,一切都很好,但是必须将树的引用传递给树渲染器的行对象似乎有点笨拙!
谁有更好的主意?
谢谢,迈克