0

我的应用程序有一个带有自定义项渲染器的树,它根据叶子上的数据类型使用不同的组件作为编辑器。在一种情况下,我正在尝试使用数据网格,以便用户可以选择满足他需要的行(需要显示几列),即。在概念上类似于 ComboBox。

为此,我将一个函数分配为“itemEditBegin”(用于树)的处理程序,在该处理程序中动态创建数据网格,然后使用弹出管理器将其显示为(模态)弹出窗口。到现在为止还挺好。

但是,如果您单击任何位置(例如,数据网格中的向下滚动按钮),弹出窗口就会消失,因为 itemEditEnd 事件被触发 - 为什么?!

在另一种情况下,我将 DateField 设置为编辑器,用户可以单击该图标以调出 DateChooser、滚动月份等。我查看了这背后的代码,它似乎使用了一个弹出窗口与我的代码完全相同!

这是“itemEditBegin”代码:

dataGrid = new DataGrid();
dataGrid.dataProvider = mddTable.dataCollection;
dataGrid.editable = false;
PopUpManager.addPopUp(dataGrid, this, true);

其中“this”是树渲染器用于一行的组件。只要单击数据网格内的任何内容(例如,行、向下滚动按钮、列分隔符等),就会调用树组件的“itemEditEnd”处理程序。

有什么想法吗?

谢谢,

麦克风。

4

2 回答 2

2

我想我必须查看代码,或者这在实践中才能完全理解。当您将 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。

有关stopPropogation()的更多信息。. 另请查看stopImmediatePropogation()。我不确定您需要哪一个,因为这取决于您的代码的结构。

于 2011-04-18T13:33:43.363 回答
1

最终我找到了一个更能解决问题的解决方案。只需在行中添加:

dataGrid.owner = this;

解决了过早的 itemEditEnd 事件问题。但是,现在我遇到了相反的问题,在我单击树的另一行之前, itemEditEnd 事件不会被触发!

我在 datagrid 上有一个“item clicked”侦听器,当单击其中一个值时会破坏 datagrid,但这样做不会导致底层树行的 itemEditEnd 事件触发。我在文档中读到组件失去焦点会导致它,所以我调度了我自己的“FocusEvent.FOCUS_OUT”事件 - 不好。

如果我手动将焦点更改为底层树,itemEditEnd 事件确实会触发并且一切都很好,但是必须将树的引用传递给树渲染器的行对象似乎有点笨拙!

有人有更好的想法吗?

谢谢,

麦克风

于 2011-05-16T10:55:39.303 回答