问题
If there are some mistakes in English, I'd like to apologize.
I want to scroll datagrid programmatically by click buttonbar event.
Following code is work, but it scrolls one by one.
What I need is page scrolling, like clicking empty horizontal scrollTrack area.
Any help would be greatly appreciated.
<?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.events.ItemClickEvent;
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"}
]);
public function init(): void
{
scrollController.dataProvider=["|<", "<", ">", ">|"];
grid.dataProvider = arr;
}
public function doScroll(event: ItemClickEvent): void
{
if (event.index ==0)
{
// force move to left end.
grid.horizontalScrollPosition = 0;
}
else if (event.index ==1){
// move left one by one
// *** I want modify here.
if (grid.horizontalScrollPosition > 0){
grid.horizontalScrollPosition -= 1;
}
}
else if (event.index ==2){
// move right one by one
// *** I want modify here too.
if (grid.horizontalScrollPosition < grid.maxHorizontalScrollPosition){
grid.horizontalScrollPosition += 1;
}
}
else{
// force move to right end.
if (grid.horizontalScrollPosition < grid.maxHorizontalScrollPosition){
grid.horizontalScrollPosition = grid.maxHorizontalScrollPosition;
}
}
}
]]>
</mx:Script>
<mx:ButtonBar id="scrollController" y="0" itemClick="doScroll(event)"/>
<mx:DataGrid id="grid" y="30" width="340" horizontalScrollPolicy="on">
<mx:columns>
<mx:DataGridColumn headerText="COL1" dataField="COL1" width="100"/>
<mx:DataGridColumn headerText="COL2" dataField="COL2" width="100"/>
<mx:DataGridColumn headerText="COL3" dataField="COL3" width="100"/>
<mx:DataGridColumn headerText="COL4" dataField="COL4" width="100"/>
<mx:DataGridColumn headerText="COL5" dataField="COL5" width="100"/>
<mx:DataGridColumn headerText="COL6" dataField="COL6" width="100"/>
<mx:DataGridColumn headerText="COL7" dataField="COL7" width="100"/>
<mx:DataGridColumn headerText="COL8" dataField="COL8" width="100"/>
<mx:DataGridColumn headerText="COL9" dataField="COL9" width="100"/>
<mx:DataGridColumn headerText="COL10" dataField="COL10" width="100"/>
<mx:DataGridColumn headerText="COL11" dataField="COL11" width="100"/>
<mx:DataGridColumn headerText="COL12" dataField="COL12" width="100"/>
<mx:DataGridColumn headerText="COL13" dataField="COL13" width="100"/>
<mx:DataGridColumn headerText="COL14" dataField="COL14" width="100"/>
<mx:DataGridColumn headerText="COL15" dataField="COL15" width="100"/>
<mx:DataGridColumn headerText="COL16" dataField="COL16" width="100"/>
<mx:DataGridColumn headerText="COL17" dataField="COL17" width="100"/>
<mx:DataGridColumn headerText="COL18" dataField="COL18" width="100"/>
<mx:DataGridColumn headerText="COL19" dataField="COL19" width="100"/>
<mx:DataGridColumn headerText="COL20" dataField="COL20" width="100"/>
</mx:columns>
</mx:DataGrid>
</mx:Application>
Run demo on wonderfl
Updated Sep 16 17:15(JST)
I wrote this code in CustomDateGrid(extended mx.DataGrid) and call from ButtonBar.
But nothing occurred.
public function scrollToRightPage(): void{
var delta:Number = this.horizontalScrollBar.pageScrollSize != 0 ? this.horizontalScrollBar.pageScrollSize : this.horizontalScrollBar.pageSize;
var direction:Number = 1;
var scrollPosition:Number = this.horizontalScrollPosition + direction * delta;
var oldPosition: Number = this.horizontalScrollPosition;
var event:ScrollEvent = new ScrollEvent(ScrollEvent.SCROLL);
event.detail = ScrollEventDetail.PAGE_RIGHT;
event.position = scrollPosition;
event.delta = scrollPosition - oldPosition;
event.direction = ScrollBarDirection.HORIZONTAL;
this.horizontalScrollBar.dispatchEvent(event);
// Call scrollHandler(the protected function defined at DataGrid.as) instead of horizontalScrollBar.dispatchEvent was also nothing occurred.
// scrollHandler(event);
}
回答1:
I gave up to dispatch ScrollEvent. But anyway I solved it by setting horizontalScrollPosition.
First, I added these functions to CustomDataGrid.
public function scrollToRightPage(): void{
// I got a hint from "mx_internal function pageScroll"(defined at ScrollBar.as).
var delta:Number = this.horizontalScrollBar.pageScrollSize != 0 ? this.horizontalScrollBar.pageScrollSize : this.horizontalScrollBar.pageSize;
var direction:Number = 1;
var scrollPosition:Number = this.horizontalScrollPosition + direction * delta;
this.horizontalScrollPosition = scrollPosition;
}
public function scrollToLeftPage(): void{
var delta:Number = this.horizontalScrollBar.pageScrollSize != 0 ? this.horizontalScrollBar.pageScrollSize : this.horizontalScrollBar.pageSize;
var direction:Number = -1;
var scrollPosition:Number = this.horizontalScrollPosition + direction * delta;
this.horizontalScrollPosition = scrollPosition;
}
And call from external class like below.
if (event.index ==0)
{
grid.horizontalScrollPosition = 0;
}
else if (event.index ==1){
if (grid.horizontalScrollPosition > 0){
//grid.horizontalScrollPosition -= 1;
// Jump to left page.
grid.scrollToLeftPage();
}
}
else if (event.index ==2){
if (grid.horizontalScrollPosition < grid.maxHorizontalScrollPosition){
//grid.horizontalScrollPosition += 1;
// Jump to right page.
grid.scrollToRightPage();
}
}
else{
if (grid.horizontalScrollPosition < grid.maxHorizontalScrollPosition){
grid.horizontalScrollPosition = grid.maxHorizontalScrollPosition;
}
}
来源:https://stackoverflow.com/questions/31672194/how-to-pagescroll-mx-datagrid-programmatically