Гибкий вариант 3: сетка данных как редактор элементов получает ‘itemEditEnd’ преждевременно

#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 средства визуализации дерева!

У кого-нибудь есть идеи получше?

Спасибо,

Майк