отключение нескольких строк в спарк-сетке данных - PullRequest
2 голосов
/ 01 сентября 2011

Есть ли способ в сетке данных spark для программного отключения некоторых строк, в flex 3 это можно сделать с помощью функции mouseEventToItemRenderer следующим образом:

override protected function mouseEventToItemRenderer (
            event: MouseEvent): IListItemRenderer {
    var listItem: IListItemRenderer;// = super.mouseEventToItemRenderer(event);
    if (_disableFlag) 
    {
        if (listItem) 
        {
            if (listItem.data) 
            {
                if (disabledRow(listItem.data)) 
                {
                    return null;
                }
            }
        }
    }
    return listItem;
}

А затем я реализую функцию disabledRow, чтобы возвращать true или false в зависимости от некоторого условия, условия, которое будет указывать, будет ли выбранный элемент отображаться или нет. Есть ли какой-нибудь способ в спринг-датагрид сделать то же самое?

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Я думаю, что сетка данных spark поддерживает событие gridrollover. при этом мы можем получить

itemrender я думаю, что это может подойти для вас

для дальнейшей ссылки, пожалуйста, обратитесь к Документации

0 голосов
/ 02 сентября 2011

Хорошо, вот как я это сделал

Первый шаг

Я создал классы SelectionIndicator, HoverIndicator и CaretIndicator, подобные тем, которые мы находим в качестве частей скина в сетке данныхskin, таким образом, часть кожи caretIndicator:

<!--- @private -->        
<fx:Component id="caretIndicator">
    <s:Rect implements="spark.components.gridClasses.IGridVisualElement">
        <fx:Script>
            <![CDATA[
                import spark.components.DataGrid;
                import spark.components.Grid;

                /**
                 * @private
                 */
                public function prepareGridVisualElement(grid:Grid, rowIndex:int, columnIndex:int):void
                {
                    const dataGrid:DataGrid = grid.dataGrid;
                    if (!dataGrid)
                        return;

                    const color:uint = dataGrid.getStyle("caretColor");
                    caretIndicatorFill.color = color;
                }
            ]]>
        </fx:Script>

        <s:stroke>
            <!--- @private -->
            <s:SolidColorStroke id="caretIndicatorFill" color="0x0167FF" weight="1"/>
        </s:stroke>
   </s:Rect>
</fx:Component>

становится

package com.tn.zuro.components
{
    import mx.graphics.SolidColorStroke;

    import spark.components.DataGrid;
    import spark.components.Grid;
    import spark.components.gridClasses.IGridVisualElement;
    import spark.primitives.Rect;

    public class CaretIndicator extends Rect implements IGridVisualElement
    {
        private var caretIndicatorFill:SolidColorStroke ;

        public function CaretIndicator()
        {
            super();
            caretIndicatorFill = new SolidColorStroke();
            this.stroke = caretIndicatorFill;
        }

        public function prepareGridVisualElement(grid:Grid, rowIndex:int, columnIndex:int):void
        {
            const dataGrid:DataGrid = grid.dataGrid;
            if (!dataGrid)
                return;

            const color:uint = dataGrid.getStyle("caretColor");
            caretIndicatorFill.color = color;
        }
    }    
}

То же самое относится к SelectionIndicator и HoverIndicator, только не забудьте использовать SolidColor вместо solidColorStroke и заполнения свойстваили Rect вместо свойства обводки.

Второй шаг

В персонализированной сетке данных я добавил прослушиватели событий для событий gridClick, gridRollOver и gridMouseDown:

this.addEventListener(GridEvent.GRID_CLICK, gridClickHandler);
this.addEventListener(GridEvent.GRID_ROLL_OVER, gridEventHandler);
this.addEventListener(GridEvent.GRID_MOUSE_DOWN, mouse_down_handler);

А вот слушатели событий:

protected function mouse_down_handler(event:GridEvent):void
{
    if (_disableFlag)
    {
        if (event.item)
        {
            if (disabledRow(event.item))
            {
                event.grid.caretIndicator = null;
                event.grid.selectionIndicator = null;
            }
        }
    }
}

protected function gridClickHandler(event:GridEvent):void
{
    if (_disableFlag)
    {
        if (event.item)
        {
            if (!disabledRow(event.item))
            {
                event.grid.selectionIndicator = new ClassFactory(SelectionIndicator);
                event.grid.caretIndicator = new ClassFactory(CaretIndicator);
            }
        }
    }
}

protected function gridEventHandler(event:GridEvent):void
{
    if (_disableFlag)
    {
        if (event.item)
        {
            if(disabledRow(event.item))
            {   
                event.grid.hoverIndicator = null;
            }
            else
            {
                event.grid.hoverIndicator = new ClassFactory(HoverIndicator);
            }
        }
    }
}

Вы, наверное, уже догадались, что _disableFlag и disabledRow соответственно являются логическим значением и функцией.Теперь последний шаг самый простой:

Третий шаг

Когда вы используете персонализированную dataGrid, если вы хотите отключить столбцы, вы устанавливаете для _disableFlag значение true и реализуетеdisabledRow, который возвращает истину, если условие выполнено, и ложь, если нет

<custom:NinjaGrid id="ninja"
                 _disableFlag=true
                  creationComplete="ninja_trainingCompleteHandler(event)"/>

protected function ninja_trainingCompleteHandler(event:FlexEvent):void
{
    ninja.disabledRow = beNinja;
}
private function beNinja(ninja:Object):Boolean
{
    if (ninja.knowHowToWalkOnWater == true)
        return true;
    return false;
}

Это решение не работает для режима выбора нескольких строк, я нашел другое решение для несколькихРежим выбора строк.


Второе решение

В этом решении я использую только компонент HoverIndicator, прослушиватель событий для события опрокидывания останется прежним.Я больше не использую прослушиватель событий для события click, и в функции mouse_down_handler у меня теперь есть этот код:

protected function mouse_down_handler(event:GridEvent):void
{
    if(_disableFlag)
    {
        if (event.item)
        {
            if (!disabledRow(event.item))
            {
                if (!event.ctrlKey)
                {
                    tempItem = event.item;
                    tempSelecteditems = new Vector.<Object>();
                    tempSelecteditems.push(tempItem);
                }
                else
                {
                    if (tempSelecteditems.indexOf(event.item) < 0)
                    {
                        tempSelecteditems.push(event.item);
                    }
                    else
                    {
                        tempSelecteditems[tempSelecteditems.indexOf(event.item)] = null;
                    }
                }

            } 
            else
            {
                if (!event.ctrlKey)
                {
                    selectedItem = tempItem;
                    tempSelecteditems = new Vector.<Object>();
                } 
                else
                {
                    if (tempSelecteditems.length)
                    {
                        selectedItems = tempSelecteditems;
                    }
                    else
                    {
                        selectedItem = tempItem;
                    }
                }
            }
        }
    }
}
...