Как автоматизировать вертикальную прокрутку в Flex AdvancedDataGrid при перетаскивании элемента ниже нижней части видимых строк?

У меня есть AdvancedDataGrid с XML dataProvider. Перетаскивание включено и работает в видимых строках ADG.

ОДНАКО, если я пытаюсь перетащить элемент за самую нижнюю видимую строку ADG, ADG НЕ прокручивается для отображения следующих строк, что делает невозможным перетаскивание за пределы сразу видимых строк. Хотя это может показаться логическим поведением сетки данных по умолчанию (перетащите вниз и продолжайте перетаскивать, чтобы отобразить последующие строки), Flex, очевидно, не делает этого. Я не понимаю, как это реализовать программно.

Кто-нибудь может помочь?


person Darrell Berry    schedule 26.05.2010    source источник


Ответы (3)


Раньше мне приходилось делать это с несколькими элементами, в основном то, что я делал, это отслеживало положение Y мыши в DG, если оно было на 50 или меньше пикселей сверху или снизу, тогда я бы установил положение вертикальной прокрутки DG + = 20 или - = 20 по мере необходимости.

Дайте мне знать, если вам понадобится фрагмент кода, но вы сможете понять, как все это сделать.

person invertedSpear    schedule 26.05.2010
comment
да круто. хочу думать в координатном пространстве, делал все мои вычисления в пространстве данных, что все усложняет, спасибо - person Darrell Berry; 26.05.2010

это сработало для меня из решения Андре, но также проверяло maxVerticalScrollPosition, и я расширял ADG

    protected function onDragOver(event:DragEvent):void
    {
        var dropIndex:int = calculateDropIndex(event);

        autoScoll(dropIndex);
    }

    //to have the adg scroll when dragging
    //http://stackoverflow.com/questions/2913420/how-to-automate-vertical-scrolling-in-flex-advanceddatagrid-when-dragging-item-be
    protected function autoScoll(dropIndex:int):void
    {
        var rowsDisplayed:Number = rowCount;
        var topvisibleIndex:int = verticalScrollPosition;
        var botvisibleIndex:int = topvisibleIndex + rowsDisplayed;

        if (dropIndex <= topvisibleIndex)
        {
            verticalScrollPosition = Math.max(verticalScrollPosition - 1, 0);
        }
        else if (dropIndex >= botvisibleIndex - 1 && dropIndex < (rowCount + maxVerticalScrollPosition - 1))
        {
            verticalScrollPosition += 1;
        }
    }
person Kyle Ward    schedule 08.09.2011

Должен полюбить Flex, чувак. Где очевидные вещи отнимают уйму времени.

Вот что я в итоге сделал:

mygrid.addEventListener( DragEvent.DRAG_OVER, handleDragOver);



public function handlerDragOver(event:DragEvent):void{
var dropIndex:int        = mygrid.calculateDropIndex(event);
var rowsDisplayed:Number = mygrid.rowCount;
var topvisibleIndex:int  = mygrid.verticalScrollPosition;
var botvisibleIndex:int  = topvisibleIndex + rowsDisplayed;


if ( dropIndex <= topvisibleIndex) {

    mygrid.verticalScrollPosition = Math.max( mygrid.verticalScrollPosition- 1, 0 );

} else if( dropIndex >= botvisibleIndex - 1 ){

mygrid.verticalScrollPosition += 1;
}

}
person Andre deBruin    schedule 11.10.2010