Flex AdvancedDataGrid отключает ленивый рендеринг

У меня есть компонент AdvancedDataGrid с некоторыми пользовательскими строками. У меня есть ограниченное количество строк, видимых внутри компонента. Другие строки могут быть доступны через полосу прокрутки. В моем приложении есть кнопка Save & Next, которая сохраняет текущую выбранную запись и повторяет выбранный элемент таблицы на 1 до конца. К сожалению, эта процедура работает только до тех пор, пока я не достигну конца видимых строк. После этого Сетка падает, когда я выбираю невидимую строку и пытаюсь прокрутить ее там программно:

//Bad Crash
this.documentBrowser.dg.selectedIndex = index + 1;
this.documentBrowser.dg.validateNow();
this.documentBrowser.dg.scrollToIndex(this.dg.selectedIndex);

Я узнал, что следующий элемент не создан в тот момент. Есть ли возможность рендерить все элементы в сетке после загрузки или отключить ленивый рендеринг?

Трассировка стека:

Ошибка типа: Ошибка #1010: термин не определен и не имеет свойств. в mx.controls.listClasses::AdvancedListBase/makeRowsAndColumnsWithExtraRows()[/Users/justinmclean/Documents/ApacheFlexSDK/frameworks/projects/advancedgrids/src/mx/controls/listClasses/AdvancedListBase.as:4008] в mxcont.:AdvancedListBase/updateDisplayList()[/Users/justinmclean/ Документы /ApacheFlexSDK/frameworks/projects/advancedgrids/src/mx/controls/listClasses/AdvancedListBase.as:3582] в mx.controls::AdvancedDataGridBaseEx/updateDisplayList()[] /justinmclean/Documents/ApacheFlexSDK/frameworks/projects/advancedgrids/src/mx/controls/AdvancedDataGridBaseEx.as:2033] в mx.controls::AdvancedDataGrid/updateDisplayList()[проекты / пользователи / проекты / документооборот Apache Framework] Apache advancedgrids/src/mx/controls/AdvancedDataGrid.as:2907] в mx.controls.listClasses::AdvancedListBase/validateDisplayList()[/Users/justinmclean/Documents/ApacheFlexSDK/frameworks/projects/advancedgrids/src/mx/controls/listClasses/AdvancedListBase.as:3480] в mx.managers::LayoutManager/validateDisplayList()[/Users/justinmclean/Documents/ApacheFlexSDK/frameworks/projects/framework/src/mx/ Manager /LayoutManager.as:744] в mx.managers::LayoutManager/doPhasedInstantiation()[/Users/justinmclean/Documents/ApacheFlexSDK/frameworks/projects/framework/src/mx/ Manager /LayoutManager.as:827] в mx.managers::LayoutManager/doPhasedInstantiationCallback()[/ Пользователи /justinmclean/Documents/ApacheFlexSDK/frameworks/projects/framework/src/mx/managers/LayoutManager.as:1195]

1 ответ

Решение

Я почти уверен, что функция отложенного рендеринга повторно использует ваши средства визуализации элементов, как только вылетает с экрана (для оптимизации производительности). Так что, может быть, вам нужно только делать то, что вы делаете с видимыми, и это останется "выполненным" для всех экземпляров рендерера?

Вы уверены, что вам нужен доступ к самим АКТУАЛЬНЫМ видимым строкам, а не к элементам в вашем dataProvider, которые их поддерживают? Если доступ к вашим данным поддержки в порядке, возможно, вам следует перебрать свой dataProvider.

Я сделал это маленькое приложение, которое прокручивает и выделяет строку с помощью функции gotoGridItem(index), Я прокручиваю до пункта, прежде чем пытаться установить selectedIndex- может быть, именно это и привело к краху?

Вот мой код:

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">

    <mx:AdvancedDataGrid id="theGrid" dataProvider="{rowDataItems}" x="50" y="50"/>
    <s:NumericStepper id="rowIndSpr" minimum="0" maximum="{theGrid.dataProvider.length-1}" value="{8}"/>
    <s:Button click="gotoGridItem(int(rowIndSpr.value))" label="Go" y="20" />

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            [bindable] public var rowDataItems:ArrayCollection = new ArrayCollection([

                //...lots of data items for rows ...

            ]);

            public function gotoGridItem(index:uint):void{


                theGrid.scrollToIndex(index);
                theGrid.selectedIndex = index;
                theGrid.validateNow();
            }
        ]]>

    </fx:Script>
</s:Application>
Другие вопросы по тегам