0

我有一个带有一些自定义行的 AdvancedDataGrid 组件。我在组件中可见的行数有限。可以通过滚动条访问其他行。在我的应用程序中,我有保存和下一个按钮,它保存实际选定的记录并将网格的选定项目迭代 1 直到结束。不幸的是,此过程仅在我到达可见行的末尾时才有效。之后,当我选择不可见的行并尝试以编程方式滚动到那里时,网格崩溃:

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

我发现在那一刻没有实例化下一个元素。加载后是否有可能渲染网格中的所有项目或停用延迟渲染?

堆栈跟踪:

TypeError:错误#1010:术语未定义且没有属性。在 mx.controls.listClasses::AdvancedListBase/makeRowsAndColumnsWithExtraRows()[/Users/justinmclean/Documents/ApacheFlexSDK/frameworks/projects/advancedgrids/src/mx/controls/listClasses/AdvancedListBase.as:4008] 在 mx.controls.listClasses: :AdvancedListBase/updateDisplayList()[/Users/justinmclean/Documents/ApacheFlexSDK/frameworks/projects/advancedgrids/src/mx/controls/listClasses/AdvancedListBase.as:3582] 在 mx.controls::AdvancedDataGridBaseEx/updateDisplayList()[/Users /justinmclean/Documents/ApacheFlexSDK/frameworks/projects/advancedgrids/src/mx/controls/AdvancedDataGridBaseEx.as:2033] 在 mx.controls::AdvancedDataGrid/updateDisplayList()[/Users/justinmclean/Documents/ApacheFlexSDK/frameworks/projects/ Advancedgrids/src/mx/controls/AdvancedDataGrid.as:2907] 在 mx。

4

1 回答 1

1

我很确定惰性渲染功能会在屏幕滚出后立即重新使用您的项目渲染器(以优化性能)。所以也许你只需要对可见的做任何你正在做的事情,它会对所有渲染器实例保持“完成”吗?

您确定需要自己访问 ACTUAL 可见行,而不是 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>
于 2013-05-29T18:31:10.180 回答