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>