我的应用程序有一个带有自定义项呈示器的树,它根据叶子上的数据类型使用不同的组件作为编辑器。在一种情况下,我尝试使用数据网格,以便用户可以选择满足其需求的行(需要显示多个列),即。在概念上类似于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中的任何内容(例如,行,向下滚动按钮,列分隔符等),就会调用它。
任何想法?
谢谢,
麦克
答案 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事件会触发并且一切都很好,但是将树的引用传递给树渲染器的行对象似乎有点笨拙!
任何人都有更好的想法吗?
谢谢,
麦克