Доступ к ItemRenderer в DataGrid

У меня есть сетка данных, в которой есть средство визуализации элементов флажка в cloumn, позволяющее выбирать строки:

Основное приложение:


<mx:DataGrid id="dg">
    <mx:columns>
        <mx:DataGridColumn id="ir" itemRenderer="renderers.RowCheckbox" /> 
        <mx:DataGridColumn dataField="Name" headerText="Name" /> 
    </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>

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


person mmattax    schedule 07.02.2009    source источник


Ответы (4)


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

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

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

person Christophe Herreman    schedule 08.02.2009
comment
Это поднимает отличный вопрос. В моем рвении, похоже, я пропустил то, о чем на самом деле спрашивал плакат; на самом деле это кажется разумным, потому что вы правы, средства визуализации используются повторно, и это повторное использование может иметь неинтуитивные и непредвиденные последствия. +1 - person Christian Nunciato; 09.02.2009
comment
Мы тоже использовали этот подход, и я согласен, что он, вероятно, самый простой. - person cliff.meyers; 10.02.2009
comment
Это, пожалуй, самое простое и элегантное решение (поскольку оно полностью соответствует правилам инкапсуляции ООП), которое мы придумали. - person Chepech; 29.12.2009
comment
Это хороший способ сделать это, если вы не возражаете против того, чтобы в ваших данных было другое дерьмо. Если вы делаете хотите пойти по сложному пути, вы можете использовать свойство visibleData в DataGrid, чтобы проанализировать, какие строки должны быть выбраны из видимых в данный момент строк. Затем, когда таблица данных прокручивается, повторно оцените, какие строки следует выбрать. - person Jonathan Dumaine; 16.09.2010
comment
Элементы itemRenderer должны изменяться в зависимости от данных, которые им предоставлены для отображения. Это потому, что ItemRenderers перерабатываются. Если вы измените данные того, что на экране является 4-м ItemRenderer, вы можете вместо этого внести изменения в 11-й. Другими словами, вы не должны изменять значения ItemRenderer извне. Вы должны сделать так, чтобы каждый ItemRenderer реагировал на изменения самостоятельно. adobe.com/devnet/flex/articles/itemrenderers_pt1.html - person Wes; 01.06.2017

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

пакет com.whatever.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. Для обоих я прослушиваю событие изменения и сохраняю в данных selected, 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;
                }
            }
        }
person Community    schedule 12.05.2009
comment
ФАНТАСТИКА. Функция indexToItemRenderer() была именно тем, что я искал. Я не могу поверить, что в DataGridBase уже нет чего-то подобного, поскольку indexToItemRenderer() ListBase не учитывает столбцы! Спасибо. - person Jonathan Dumaine; 10.09.2010

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

Например:

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

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

person Christian Nunciato    schedule 07.02.2009
comment
Я не думаю, что это будет работать с несколькими средствами визуализации элементов в разных столбцах, скажем, мне нужно средство визуализации в другом столбце, как я могу это сделать? - person mmattax; 08.02.2009
comment
Хорошая мысль, да. Ответ Кристофа на самом деле лучше; Я использовал описанный выше подход для одноколоночных списков без прокрутки и получил хорошие результаты, но то, что вы действительно ищете, не является ни свойством базовых данных, ни видимых объектов отображения, а скорее чем-то средним . - person Christian Nunciato; 09.02.2009
comment
Вы можете изменить указанную выше функцию, чтобы проверить строку и столбец пользовательского Renderer... someFunction(row:int,cell:int):void - person AndrewB; 08.06.2009

В ItemRenderer попробуйте поместить компонент Checkbox в VBox. Решит проблему прокрутки.

person himanshu    schedule 26.05.2010