Flex 3: Datagrid как редактор элементов преждевременно получает itemEditEnd

У моего приложения есть дерево с настраиваемым средством визуализации элементов, которое в зависимости от типа данных на листе использует различные компоненты в качестве редакторов. В одном случае я пытаюсь использовать сетку данных, чтобы пользователь мог выбрать строку, соответствующую его потребностям (необходимо отобразить несколько столбцов), т.е. похож на концепцию ComboBox.

Для этого у меня есть функция, назначенная обработчиком для itemEditBegin (для дерева), в котором я динамически создаю сетку данных, а затем использую менеджер всплывающих окон, чтобы отобразить его как (модальное) всплывающее окно. Все идет нормально.

Однако, если вы щелкнете где-нибудь (например, кнопку прокрутки вниз в сетке данных), всплывающее окно исчезнет, ​​потому что событие itemEditEnd вызвано - почему?!

В другом сценарии у меня есть настройка DateField в качестве редактора, и пользователь может щелкнуть значок, чтобы вызвать DateChooser, прокрутить месяцы и т. Д. Я посмотрел код, стоящий за этим, и он использует всплывающее окно, по-видимому, точно так же, как мой код!

Вот код 'itemEditBegin':

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

где 'this' - компонент, используемый средством рендеринга дерева для строки. Это обработчик itemEditEnd компонента дерева, который вызывается, как только щелкается что-либо внутри сетки данных (например, строка, кнопка прокрутки вниз, разделитель столбцов и т. Д.).

Любые идеи кто-нибудь?

Спасибо,

Майк.

2 ответа

Решение

В конце концов я нашел решение, которое более-менее решает проблему. Просто добавив в строку:

dataGrid.owner = this;

решена проблема преждевременного события itemEditEnd. Однако теперь у меня возникла противоположная проблема: событие itemEditEnd не запускается, пока я не нажму на другую строку дерева!

У меня есть слушатель 'item clicked' в сетке данных, который уничтожает сетку данных при щелчке по одному из значений, но только выполнение этого не вызывает событие itemEditEnd базовой строки дерева. Я прочитал в документах, что компонент теряет фокус, поэтому отправил свое собственное событие FocusEvent.FOCUS_OUT - ничего хорошего.

Если я вручную изменю фокус на нижележащее дерево, событие itemEditEnd срабатывает, и все хорошо, но кажется немного неуклюжим передать эту ссылку на объект строки средства визуализации дерева!

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

Спасибо,

Майк

Я предполагаю, что мне нужно увидеть код или это работает на практике, чтобы полностью понять. Похоже, что отдельные столбцы DataGrid можно редактировать, когда вы используете DataGrid в качестве itemEditor. Это верно?

Когда вы фокусируете элемент itemEditor в 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 ()., Также проверьте stopImmediatePropogation (). Я не уверен, какой из них вам понадобится, так как это зависит от структуры вашего кода.

Другие вопросы по тегам