#apache-flex #datagrid #popup #itemeditor
#apache-flex #datagrid #всплывающее окно #itemeditor
Вопрос:
В моем приложении есть дерево с пользовательским средством визуализации элементов, которое в зависимости от типа данных на листе использует разные компоненты в качестве редакторов. В одном случае я пытаюсь использовать datagrid, чтобы пользователь мог выбрать строку, которая соответствует его потребностям (необходимо отобразить несколько столбцов), т. Е. аналогичную по концепции со списком.
Для этого у меня есть функция, назначенная обработчиком для ‘itemEditBegin’ (для дерева), в которой я динамически создаю datagrid, а затем использую менеджер всплывающих окон для отображения его как (модального) всплывающего окна. Пока все хорошо.
Однако, если вы нажмете в любом месте (например, кнопку прокрутки вниз в datagrid), всплывающее окно исчезнет, потому что запускается событие itemEditEnd — почему?!
В другом сценарии у меня есть настройка DateField в качестве редактора, и пользователь может щелкнуть по значку, чтобы вызвать DateChooser, прокрутить месяцы и т.д. Я посмотрел на код, стоящий за этим, и он использует всплывающее окно, похоже, точно так же, как и мой код!
Вот код ‘itemEditBegin’:
dataGrid = new DataGrid();
dataGrid.dataProvider = mddTable.dataCollection;
dataGrid.editable = false;
PopUpManager.addPopUp(dataGrid, this, true);
где ‘this’ — это компонент, используемый средством визуализации дерева для строки. Это обработчик ‘itemEditEnd’ компонента дерева, который вызывается, как только щелкается что-либо внутри datagrid (например, строка, кнопка прокрутки вниз, разделитель столбцов и т.д.).
У кого-нибудь есть идеи?
Спасибо,
Майк.
Ответ №1:
Я думаю, мне нужно было бы увидеть код или это работает на практике, чтобы полностью понять. Похоже, что отдельные столбцы DataGrid доступны для редактирования, когда вы используете DataGrid в качестве редактора элементов. Это правильно?
Когда вы фокусируетесь на элементе редактирования в DataGrid, он запускает событие 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().. Также проверьте Stopimmediateprop Propogation(). Я не уверен, какой из них вам понадобится, поскольку это зависит от того, как структурирован ваш код.
Комментарии:
1. Привет, спасибо за ответ. На самом деле столбцы недоступны для редактирования — я добавил некоторый код в исходный вопрос. itemEditEnd дерева срабатывает, как только щелкается что-либо в datagrid. Кстати, если бы datagrid постоянно запускал ‘itemEditeEnd’, отреагировало бы дерево на это? Приветствия, Майк
Ответ №2:
В конце концов я нашел решение, которое, тем не менее, устраняет проблему. Просто добавляя в строку:
dataGrid.owner = this;
решена проблема с преждевременным событием itemEditEnd. Однако теперь у меня противоположная проблема, когда событие itemEditEnd не запускается, пока я не нажму на другую строку дерева!
У меня есть прослушиватель ‘элемент щелкнул’ в datagrid, который уничтожает datagrid при нажатии на одно из значений, но простое выполнение этого не приводит к запуску события itemEditEnd базовой строки дерева. Я прочитал в документах, что причиной этого является потеря фокуса компонентом, поэтому я отправил свой собственный ‘FocusEvent.Событие FOCUS_OUT’ — бесполезно.
Если я вручную переключу фокус на базовое дерево, событие itemEditEnd сработает, и все будет хорошо, но кажется немного неуклюжим передавать ссылку на дерево объекту row средства визуализации дерева!
У кого-нибудь есть идеи получше?
Спасибо,
Майк