Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Инициализация AdvancedDataGrid (http://www.flasher.ru/forum/showthread.php?t=173886)

zorexundra 13.01.2012 12:29

Инициализация AdvancedDataGrid
 
Здравствуйте! Помогите, пожалуйста, разобраться в проблеме!
Есть приложение Flex SDK 3.5, есть экземпляр mx:TitleWindow добавляемый на сцену методом PopUpManager.createPopUp, в этом TitleWindow есть экземпляр mx:AdvancedDataGrid. По событию creationComplete TitleWindow, программно задаётся структура AdvancedDataGrid, десериализируется объект Array и задаётся в качестве источника данных для этого AdvancedDataGrid.
Проблема: при выполнении этой процедуры, часто появляется runtime-ошибка:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at mx.controls::AdvancedDataGrid/findHeaderRenderer()[C:\work\flex\dmv_automation\projects\datavisualisation\src\mx\controls\AdvancedDataGrid.as:1352]
at mx.controls::AdvancedDataGrid/mouseEventToItemRenderer()[C:\work\flex\dmv_automation\projects\datavisualisation\src\mx\controls\AdvancedDataGrid.as:1317]
at mx.controls.listClasses::AdvancedListBase/mouseMoveHandler()[C:\work\flex\dmv_automation\projects\datavisualisation\src\mx\controls\listClasses\AdvancedListBase.as:8085]


В чём может быть проблема? Может десериализация источника данных занимает много времени и в момент инициализации AdvancedDataGrid объект dataProvider ещё не готов? Как отследить момент готовности объекта sourse? Что вообще происходит?
Вот код всего компонента:
Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" creationPolicy="all" creationComplete="componentCompleteHandler()" layout="absolute" width="100%" height="100%" showCloseButton="true" close="mx.core.Application.application.appEventHandler(event);">
        <mx:Script>
                <![CDATA[
                        import mx.core.Application;
                        import mx.utils.Base64Decoder;
                        import mx.utils.Base64Encoder;
                        import mx.controls.advancedDataGridClasses.AdvancedDataGridColumnGroup;
                        import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn;
                        protected function componentCompleteHandler():void{
                                var baDec:Base64Decoder = new Base64Decoder();
                                baDec.decode(Application.application.DataGrid1.selectedItem.STOLBEC);
                                var ba2:ByteArray = baDec.toByteArray();
                                ba2.position = 0;
                                var newAr:Array = ba2.readObject();
 
                                var column1:AdvancedDataGridColumn = new AdvancedDataGridColumn();
                                column1.dataField = "par1";
 
                                var column2:AdvancedDataGridColumn = new AdvancedDataGridColumn();
                                column2.dataField = "par2";
 
                                var groupColumnviewDG:AdvancedDataGridColumnGroup = new AdvancedDataGridColumnGroup();
                                groupColumnviewDG.dataField = "group";
 
                                for each(var element:Object in newAr[0].group){
                                        var newDGColumn:AdvancedDataGridColumnGroup = new AdvancedDataGridColumnGroup();
                                        newDGColumn.dataField = "e"+element.ID;
                                        var newGroupColumn1:AdvancedDataGridColumn = new AdvancedDataGridColumn();
                                        newGroupColumn1.dataField = "p1";
                                        newGroupColumn1.itemRenderer = new ClassFactory(ItemRend1);
                                        var newGroupColumn2:AdvancedDataGridColumn = new AdvancedDataGridColumn();
                                        newGroupColumn2.dataField = "p2";
                                        var newGroupColumn3:AdvancedDataGridColumn = new AdvancedDataGridColumn();
                                        newGroupColumn3.itemRenderer = new ClassFactory(ItemRend2);
                                        newGroupColumn3.dataField = "p1";
 
                                        newDGColumn.children.push(newGroupColumn1, newGroupColumn2, newGroupColumn3);
                                        groupColumnviewDG.children.push(newDGColumn);
                                }
                                viewDG.groupedColumns = new Array(column1, column2, groupColumnviewDG);
                                viewDG.dataProvider = newAr;
                        }
                ]]>
        </mx:Script>
        <mx:AdvancedDataGrid id="viewDG" width="{Application.application.stage.width-40}" height="{Application.application.stage.height-60}" lockedColumnCount="2" horizontalScrollPolicy="auto" headerWordWrap="true" variableRowHeight="true" wordWrap="true"/>
</mx:TitleWindow>


wvxvw 14.01.2012 13:24

Возможно есть смысл поэксперементировать с порядком инициализации, т.е. провайдер после колонок, или наоборот и т.п. Но ADG дрянь та еще... я в итоге сдался искать и разбираться, если что-то такое случается - просто наследую класс от ADG и в нем переопределяю функцию которая себя "плохо ведет". У этих ошибок, как правило, нет логического объяснения, просто исходный код очень низкого качества, и, естесственно, ошибки случаются.

zorexundra 19.01.2012 19:20

Цитата:

Сообщение от wvxvw (Сообщение 1056775)
...просто наследую класс от ADG и в нем переопределяю функцию которая себя "плохо ведет"...

Метод, который случайно генерирует ошибку - findHeaderRenderer, имеет идентификатор управления доступом private. Как быть в этом случае?

GBee 19.01.2012 20:22

Вызывайте componentCompleteHandler в creationComplete самого грида. Остальной код очень жуткий.

alatar 19.01.2012 20:39

Боритесь с причиной, а не последствиями. Ошибка у вас возникает, после того как мышка оказывается над гридом. Попробуйте в начале метода componentCompleteHandler поставить viewDG.endbled = false, в конце true.

P.S. Вы в этой каше, сами хоть ориентируетесь?

zorexundra 20.01.2012 13:33

Цитата:

Сообщение от alatar (Сообщение 1057981)
...Ошибка у вас возникает, после того как мышка оказывается над гридом...

Диагноз абсолютно точный. alatar, уже не знаю, как выражать признательность.
Цитата:

Сообщение от alatar (Сообщение 1057981)
...P.S. Вы в этой каше, сами хоть ориентируетесь?

Мне не известно количество колонок поставщика данных, сам AdvancedDataGrid по умолчанию не распознаёт структуру вложенных объектов: sourse={{...},{...},{{...},...,{...}}}. Если Вы подскажите мне, как возможно задекларировать струкутру данных или изменить её, чтобы AdvancedDataGrid увидел вложенные объекты, то я... опять буду признателен Вам!

alatar 22.01.2012 12:24

Я имел ввиду такие конструкции Application.application.DataGrid1.selectedItem.STOLBEC, Application.application.stage.width-40 и т.д.

zorexundra 23.01.2012 11:56

Насчёт Application.application.stage==stage согласен. stage она и в IFlexDisplayObject stage. А какая практика лучшая для обращения к объекту расположенному в Application.application?

alatar 23.01.2012 12:28

Не должно быть такой практики. Дети не должны знать, что внутри их родителей, передавайте необходимые данные при вызове объекта, также и с размерами. PopUpManager.createPopUp возвращает созданный объект. Ссылку на root можно получить через systemManager.getSandboxRoot(), а уже у него можно получить stage.

zorexundra 23.01.2012 12:40

Правильно-ли я понял, что вложенные классы должны содержать собственные свойства-переменные со значением ссылок на объекты других классов?
Чем вызвана необходимость в дополнительных строках кода?
...Впрочем один аргумент я уже открыл для себя: при Вашем подходе ошибка указанная в начале темы исчезла.
Чуть раньше я её латал таймером, который с запаздыванием присваивал значение AdvancedDataGrid.enabled=true
Хотя, как по мне, визуализация инициализации AdvancedDataGrid раньше была лучше: появлялся пустой AdvancedDataGrid, через долю секунды его содержимое, теперь: появляется AdvancedDataGrid с двумя заполненными колонками, затем через долю секунды AdvancedDataGrid приобретает окончательный вид. Может надо ещё поработать...


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

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