2015-09-17 3 views
0

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?

Répondre

0

Mise à jour 1 Mars 2016

La réponse précédente fonctionne parfois mal ...
Enfin je lui ai donné à calculer maxHorizontalScrollPosition.

La solution que j'utilise maintenant est le code suivant.

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