Flex 3: Datagrid как редактор элементов получает преждевременно 'itemEditEnd' - PullRequest
0 голосов
/ 18 апреля 2011

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

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

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

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

Вот код 'itemEditBegin':

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

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

Есть идеи у кого-нибудь?

Спасибо,

Mike.

Ответы [ 2 ]

2 голосов
/ 18 апреля 2011

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

1 голос
/ 16 мая 2011

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

dataGrid.owner = this;

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

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

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

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

Спасибо

Mike

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...