Flex 3:Datagrid作为项目编辑器过早地获取'itemEditEnd'

时间:2011-04-18 12:30:45

标签: flex datagrid popup itemeditor

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

为此,我将一个函数指定为'itemEditBegin'(对于树)的处理程序,我在其中动态创建datagrid,然后使用弹出管理器将其显示为(模态)弹出窗口。到目前为止一切都很好。

但是,如果你点击任何地方(例如,在数据网格中向下滚动按钮)弹出窗口消失,因为itemEditEnd事件被触发 - 为什么?!

在另一种情况下,我将DateField设置为编辑器,用户可以单击图标以显示DateChooser,滚动月份等等。我查看了这背后的代码,它使用的是弹出窗口,看起来和我的代码完全一样!

这是'itemEditBegin'代码:

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

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

任何想法?

谢谢,

麦克

2 个答案:

答案 0 :(得分: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()。我不确定您需要哪一个,因为这取决于您的代码的结构。

答案 1 :(得分:1)

最终我找到了一个无法解决问题的解决方案。只需添加一行:

dataGrid.owner = this;

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

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

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

任何人都有更好的想法吗?

谢谢,

麦克