J'essaie de faire défiler mx.DataGrid par programme. Dans that case, j'ai forcé le défilement vers la droite en suivant le code.mx.DataGrid: Comment forcer le défilement vers la bonne extrémité par programmation?
grid.horizontalScrollPosition = grid.maxHorizontalScrollPosition;
Mais dans certains cas, maxHorizontalScrollPosition renvoie la valeur incorrecte.
Il semble que la valeur maxHorizontalScrollPosition soit calculée en fonction de la largeur de la grille et de la largeur des colonnes, et parfois erronée.
Le code suivant est le cas de test reproductible.
<?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>
Quelle est la bonne façon de forcer le défilement vers la droite? J'utilise Flex SDK3.4.
Mise à jour: 17 septembre 15h28 (JST)
Pour autant que je vis "configureScrollBars de fonction de forçage protégé()" (défini à DataGrid.as), il semble que maxHorizontalScrollPosition est calculée par
maxHorizontalScrollPosition = displayableColumns.length - lockedColumnCount - colCount;
Dans mon cas
displayableColumns.length(Columns with visible="true") = 23
lockedColumnCount = 0
colCount = visibleColumns.length = 17 (sum of COL1 ~ COL17 width is 995)
valeur initiale de maxHorizontalScrollPosition Ainsi retourne certainement 6.
Chaque fois que je move scrollThumb quelque part, visibleColumns.length et maxHorizontalScrollPosition change également en fonction de la position de scrollThumb.
hmm .. cela signifie que je ne devrais pas utiliser maxHorizontalScrollPosition. Mais quelle est la bonne façon?