Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   custom itemEditor AdvancedDataGrid (http://www.flasher.ru/forum/showthread.php?t=191093)

Dukobpa3 31.12.2012 11:41

custom itemEditor AdvancedDataGrid
 
Написал свой itemEditor для AdvancedDataGrid.

В этом эдиторе есть кнопка которая грузит файл с диска на сервер и вкручивает урл в поле данных.
Проблема в том что когда я выбираю файл, выкидывается виндовый диалог выбора файлов. ДатаГрид теряет фокус. А при потере фокуса он убивает эдитор по-умолчанию.

Так вот эту проблему я решил, уже не убивает если мне не надо его убивать. Но теперь другая хрень. ДатаГрид использует ровно столько єдиторов и рендереров сколько влазит в экран. В моем случае 20 штук.
Если таблица больше 20-и - те которые не влазят в первую страницу редактируются неадекватно.

Вроде как погуглил - правильно надо не блочить закрытие эдитора как делаю я, а сохранять данные, убивать эдитор, а потом при получении фокуса опять пересоздавать его. И в него пихать новые данные.

Окай, сделал так, но проблема с 20-ю элементами всё-равно осталась. Видимо как-то неправильно создаю. Чего гриду не хватает при создании эдитора который не влазит в первую страницу.

Код покажу если надо. Просто я совсем не уверен что правильно делаю потому просто хочу спросить - а как надо? Мне кажется что проще будет этот участок переписать нежели исправить.

alatar 31.12.2012 12:13

Если с эдитором, то так и надо, как в последнем варианте. Ты бы в картинках объяснил, что тебе надо и что получается.

Dukobpa3 31.12.2012 13:04

Файл который открывает диалог - находится прямо в эдиторе. Получается что результат открытия файла у меня в эдиторе. В итоге я открываю файл провожу с ним манипуляции всё ок.

Во-первых я лочу эдитор от закрытия если диалог сейчас открыт.
Код AS3:

        private function onItemEditEnd(event:AdvancedDataGridEvent):void
        {
                var data:NodeModel = event.itemRenderer ? event.itemRenderer.data as NodeModel : null;
 
                if (event.currentTarget.itemEditorInstance.wait)
                {
                        event.preventDefault();
                        if (event.reason == DataGridEventReason.OTHER)// этот ризон при потере фокуса приходит.
                        {
                                _editorInstance = itemEditorInstance;
                                _editorPosition = editedItemPosition;
                        }
                }
        }
 
        override public function destroyItemEditor():void
        {
                if (_editorInstance &&  _editorInstance.wait)
                {
                        return;
                }
                else
                {
                        if(itemEditorInstance) super.destroyItemEditor();
                        _editorInstance = null;
                }
        }

Потом по получении фокуса гридом обратно - удаляю старый эдитор и добавляю новый с теми же данными.
Код AS3:

private function onFocusIn(event:FocusEvent):void
                        {
                                if (_editorPosition)
                                {
                                        var pos:Object = CeaUtills.cloneObject(_editorPosition);
                                        if(_editorInstance) createItemEditor(pos.columnIndex, pos.rowIndex);
                                }
                        }

Это работает если я умещаюсь в первую страницу прокрутки (с первого по 2-й элемент) а уже на 21-м вылетает какая-то внутрення ошибка грида. так как он запакован во внешний компонент я не вижу что там и как. Говорит что где-то там он нулл получил. А какой нулл я не знаю.

Добавлено через 1 минуту
Это мой первый проект на флексе, я вообще пур-ас3 пишу обычно. Так что не исключено что тут полная шляпа. Буду рад любым комментариям.
репо на битбакете

Добавлено через 5 минут
Эта схема редактирует текущую ячейку нормально. Но при переходе на другую вылетает. При условии что текущая находится вне этих 20-и строк. Ошибка где-то внутри грида в editEnd().

alatar 31.12.2012 13:47

Цитата:

Это работает если я умещаюсь в первую страницу прокрутки (с первого по 2-й элемент) а уже на 21-м вылетает какая-то внутрення ошибка грида. так как он запакован во внешний компонент я не вижу что там и как. Говорит что где-то там он нулл получил. А какой нулл я не знаю.
В смысле? По стеку назад пройдись и посмотри.

Можно и без editor'a обойтись. Сделай просто ItemRenderer с кнопкой (или выглядящий как кнопка), при клике на него вызывай диалог открытия файла и посылай всплывающее событие со ссылкой на item и filereference (как пример). Или прям в рендерере и меняй данные.

Или из эдитора событие посылай и не трогай onItemEditEnd.

Не понятно зачем тебе понадобился эдитор в данном случае, если он не редактирует данные.

Dukobpa3 31.12.2012 14:01

Цитата:

В смысле? По стеку назад пройдись и посмотри.
Весь стек внутри грида, там нету ни одной строчки моего кода.

Цитата:

Не понятно зачем тебе понадобился эдитор в данном случае, если он не редактирует данные.
Ну как это не меняет, он ссылку полученную в данные сохраняет. Плюс к этой кнопке там можно этот урл вручную вбить, не выбирая файл.

alatar 31.12.2012 14:40

Открой отдельное окно и не мучайся. ItemEditor больше подходит для инлайн редактирования.
Скорее всего ты пытаешься получить несуществующий рендерер. Увы я стек телепатически получать не умею. В каком классе, в исходниках, хоть находится приведенный код?

Dukobpa3 31.12.2012 15:17

Вложений: 1
Вложение 28910
Ну так инлайн редактирование и есть) Еще одно окно я слабо представляю куда тут прикрутить. Но могу конечно вынести кнопку куда-то нафиг в тулбар, а потом руками всё делать, данные обновлять и в таком духе.

Dukobpa3 31.12.2012 15:20

Цитата:

В каком классе, в исходниках, хоть находится приведенный код?
в классе расширяющем АДГ

alatar 31.12.2012 15:37

Цитата:

в классе расширяющем АДГ
Я не вижу там класса расширяющего ADG?

Добавлено через 2 минуты
Что сохраняется в editedItemPosition?

Dukobpa3 31.12.2012 15:46

JsonTreeGrid.mxml

Добавлено через 46 секунд
Короче ладно, прикручу тулбар. Но вообще проблему хотелось бы решить хотя бы из-за спортивного интереса.

Добавлено через 5 минут
Цитата:

Что сохраняется в editedItemPosition?
Это переменная АДГ которая обновляется когда начали изменение. Тут хранится координата редактируемой ячейки.


Часовой пояс GMT +4, время: 11:09.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.