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