2015-09-17 1 views
0

Я пытаюсь прокрутить mx.DataGrid программно. В that case я заставил прокрутить вправо, указав следующий код.mx.DataGrid: Как принудительно выполнить прокрутку вправо?

grid.horizontalScrollPosition = grid.maxHorizontalScrollPosition; 

Но в некоторых случаях maxHorizontalScrollPosition возвращает неверное значение.
Похоже, вычисляемое значение maxHorizontalScrollPosition зависит от ширины сетки и ширины столбцов, а иногда и от неправильного.
Следующий код - это воспроизводимый тестовый чехол.

<?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.

Обновлено: 17 сентября 15:28 (JST)
Насколько я видел "переопределить защищенная функция configureScrollBars()" (определено в DataGrid.as), кажется, что maxHorizontalScrollPosition вычисляется

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) 

Так начальное значение maxHorizontalScrollPosition возвращается, конечно 6.
Всякий раз, когда я перемещение scrollThumb где-то, visibleColumns.length и maxHorizontalScrollPosition также изменяется в зависимости от положения scrollThumb.

хм .. это означает, что я не должен использовать maxHorizontalScrollPosition. Но каков правильный путь?

ответ

0

Обновлено: 1 марта 2016 года

Предыдущий ответ иногда работает неправильно ...
Наконец я сдался, чтобы вычислить maxHorizontalScrollPosition.

Решение, которое я использую сейчас, является следующим кодом.

while (grid.horizontalScrollPosition < grid.maxHorizontalScrollPosition-grid.lockedColumnCount){ 
    grid.horizontalScrollPosition = grid.maxHorizontalScrollPosition-grid.lockedColumnCount; 
} 
Смежные вопросы