mx.DataGrid:如何以编程方式强制滚动到右端?

时间:2015-09-17 03:25:11

标签: actionscript-3 flex flex3

我正在尝试以编程方式滚动mx.DataGrid。 在that case中,我通过以下代码强制滚动到右端。

grid.horizontalScrollPosition = grid.maxHorizontalScrollPosition;

但在某些情况下,maxHorizo​​ntalScrollPosition会返回不正确的值 似乎maxHorizo​​ntalScrollPosition的计算值取决于网格宽度和列宽,有时是错误的 以下代码是可重现的测试用例。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">
    <mx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;

            private var arr:ArrayCollection = new ArrayCollection([
                {COL1:"aaa",COL2:"bbb",COL3:"ccc",COL4:"ddd",COL5:"eee",COL6:"fff",COL7:"ggg",COL8:"hhh",COL9:"iii",COL10:"jjj",COL11:"kkk",COL12:"lll",COL13:"mmm",COL14:"nnn",COL15:"ooo",COL16:"ppp",COL17:"qqq",COL18:"rrr",COL19:"sss",COL20:"ttt",COL21:"uuu",COL22:"vvv",COL23:"www"}
            ]);
            public function init(): void
            {
                grid.dataProvider = arr;
            }

            public function doScroll(): void
            {
                // this doesn't scroll to the right end sometimes.
                grid.horizontalScrollPosition = grid.maxHorizontalScrollPosition;
            }

        ]]>
    </mx:Script>
    <mx:Button click="{doScroll()}" label="Scroll to right"/>
    <mx:DataGrid id="grid" y="30" width="1000" horizontalScrollPolicy="on">
        <mx:columns>
            <mx:DataGridColumn headerText="COL1" dataField="COL1" width="70"/>
            <mx:DataGridColumn headerText="COL2" dataField="COL2" width="210"/>
            <mx:DataGridColumn headerText="COL3" dataField="COL3" width="80"/>
            <mx:DataGridColumn headerText="COL4" dataField="COL4" width="100"/>
            <mx:DataGridColumn headerText="COL5" dataField="COL5" width="25"/>
            <mx:DataGridColumn headerText="COL6" dataField="COL6" width="25"/>
            <mx:DataGridColumn headerText="COL7" dataField="COL7" width="25"/>
            <mx:DataGridColumn headerText="COL8" dataField="COL8" width="70"/>
            <mx:DataGridColumn headerText="COL9" dataField="COL9" width="55"/>
            <mx:DataGridColumn headerText="COL10" dataField="COL10" width="160"/>
            <mx:DataGridColumn headerText="COL11" dataField="COL11" width="25"/>
            <mx:DataGridColumn headerText="COL12" dataField="COL12" width="25"/>
            <mx:DataGridColumn headerText="COL13" dataField="COL13" width="25"/>
            <mx:DataGridColumn headerText="COL14" dataField="COL14" width="25"/>
            <mx:DataGridColumn headerText="COL15" dataField="COL15" width="25"/>
            <mx:DataGridColumn headerText="COL16" dataField="COL16" width="25"/>
            <mx:DataGridColumn headerText="COL17" dataField="COL17" width="25"/>
            <mx:DataGridColumn headerText="COL18" dataField="COL18" width="100"/>
            <mx:DataGridColumn headerText="COL19" dataField="COL19" width="150"/>
            <mx:DataGridColumn headerText="COL20" dataField="COL20" width="100"/>
            <mx:DataGridColumn headerText="COL21" dataField="COL21" width="150"/>
            <mx:DataGridColumn headerText="COL22" dataField="COL22" width="100"/>
            <mx:DataGridColumn headerText="COL23" dataField="COL23" width="100"/>
        </mx:columns>
    </mx:DataGrid>
</mx:Application>

强制滚动到右端的正确方法是什么?
我正在使用Flex SDK3.4。

更新时间: 9月17日15:28(JST)
至于我看到“覆盖受保护的函数configureScrollBars()”(在DataGrid.as中定义),似乎maxHorizo​​ntalScrollPosition由

计算
maxHorizontalScrollPosition = displayableColumns.length - lockedColumnCount - colCount;

就我而言

displayableColumns.length(Columns with visible="true")  = 23
lockedColumnCount  = 0
colCount = visibleColumns.length = 17 (sum of COL1 ~ COL17 width is 995)

因此maxHorizo​​ntalScrollPosition的初始值肯定会返回6.
每当我在某处移动scrollThumb时,visibleColumns.length和maxHorizo​​ntalScrollPosition也会根据scrollThumb的位置而改变。

嗯..这意味着我不应该使用maxHorizo​​ntalScrollPosition。 但是正确的方法是什么?

1 个答案:

答案 0 :(得分:0)

更新时间:2016年3月1日

以前的回答有时会有误...... 最后我放弃了计算maxHorizo​​ntalScrollPosition。

我现在使用的解决方案是遵循代码。

while (grid.horizontalScrollPosition < grid.maxHorizontalScrollPosition-grid.lockedColumnCount){
    grid.horizontalScrollPosition = grid.maxHorizontalScrollPosition-grid.lockedColumnCount;
}