Доступ к ItemRenderer в DataGrid - PullRequest
       11

Доступ к ItemRenderer в DataGrid

4 голосов
/ 08 февраля 2009

У меня есть сетка данных, в которой есть средство рендеринга элементов в поле для выбора строк:

Основное применение:


<mx:DataGrid id="dg">
    <mx:columns>
        <mx:DataGridColumn id="ir" itemRenderer="renderers.RowCheckbox" /> 
        <mx:DataGridColumn dataField="Name" headerText="Name" /> 
    &lt/mx:columns>
</mx:DataGrid>

Визуализатор предметов:


<-- RowCheckbox -->
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" horizontalAlign="center"> 
    <mx:CheckBox id="chk"/>
</mx:HBox>

Как я могу получить дескриптор для рендерера / флажка элемента, чтобы я мог определить, какие строки проверяются?

Ответы [ 4 ]

9 голосов
/ 08 февраля 2009

Просто совет: у нас была похожая проблема в нашем приложении, и мы решили ее, добавив свойство «selected» к сущностям в поставщике данных в сетке данных. Выбранное свойство checkBox было затем привязано к выбранному свойству нашей сущности. Чтобы узнать, какие из них были выбраны, мы просто зациклились на объектах в поставщике данных вместо средств визуализации элементов. После множества разных подходов это действительно был лучший вариант.

Если я правильно помню, проблема заключалась в том, что обработчики предметов не запомнили выбранное состояние правильно, и сетка данных была полностью запутана, когда вы прокручивали вверх и вниз. Неправильные строки были выбраны после прокрутки.

Другим вариантом будет отправка события в средстве визуализации элементов, которое всплывает на всем пути к элементу управления, содержащему сетку данных. Затем вы можете прослушать эти события и обновить вашу модель, чтобы отразить изменения.

2 голосов
/ 12 мая 2009

Я столкнулся с похожими проблемами с DataGrid и несколькими средствами визуализации элементов и повторным использованием средств визуализации элементов при прокрутке. Чтобы получить доступ к средствам визуализации элементов DataGrid, я расширил DataGrid. Моей первой мыслью было использовать indicesToIndex (), а затем indexToItemRenderer (). К сожалению, эти методы не дали ожидаемого результата, поэтому я добавил метод indicesToItemRenderer ():

пакет com.whever.controls {

import mx.controls.DataGrid;
import mx.controls.listClasses.IListItemRenderer;

public class CustomDataGrid extends DataGrid
{

    public function CustomDataGrid()
    {
        super();
    }

    public function indicesToItemRenderer(rowIndex:int, colIndex:int):IListItemRenderer
    {
        var firstItemIndex:int = verticalScrollPosition - offscreenExtraRowsTop;
        if (rowIndex < firstItemIndex ||
            rowIndex >= firstItemIndex + listItems.length
            )
        {
            return null;
        }

        return listItems[rowIndex - firstItemIndex][colIndex];
    }

}

Чтобы разрешить повторно использованные средства визуализации элементов при прокрутке, обратитесь к этой статье:

http://www.adobe.com/devnet/flex/articles/itemrenderers_pt1.html

Это сводится к переопределению установщика данных и сохранению свойств в данных. Например, у меня был один столбец, использующий CheckBox itemRenderer, и другой столбец, использующий ComboBox. И то, и другое прислушивается к событию изменения и сохраняет выбранные, selectedIndex и т. Д. В данных всякий раз, когда изменяются свойства, и переопределяет установщик данных для установки этих свойств:

        override public function set data(value:Object):void
        {
            if (value != null)
            {
                super.data = value;

                if (data.hasOwnProperty('selected') && data.selected)
                {
                    selected = data.selected;
                }
                else
                {
                    selected = false;
                }
            }
        }
0 голосов
/ 26 мая 2010

В ItemRenderer попробуйте поместить компонент флажка в VBox. Устранена проблема с прокруткой.

0 голосов
/ 08 февраля 2009

Вы можете использовать метод indexToItemRenderer(), предоставляемый всеми подклассами ListBase.

Например:

private function someFunction(index:int):void
{
    var rowCheckbox:RowCheckbox = dg.indexToItemRenderer(index) as RowCheckbox;
    trace(rowCheckbox.chk.selected.toString());
}

... где index представляет индекс элемента DataGrid, свойство которого "chk" вы хотите проверить.

...