2009-02-07 2 views
4

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

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

 

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

Item рендерер:

 

<-- 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> 
 

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

ответ

9

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

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

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

+1

Это создает отличную точку. В моем рвении, похоже, я пропустил то, что действительно спрашивал плакат; на самом деле это кажется правильным способом, потому что вы правы, визуализаторы повторно используются, и повторное использование может иметь непреднамеренные и непреднамеренные последствия. +1 –

+1

Мы также использовали этот подход, и я согласен, что это, наверное, самый простой. –

+0

Это, наверное, самое простое и изящное решение (поскольку оно полностью соответствует правилам инкапсуляции ООП), которые мы придумали. – Chepech

0

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

Например:

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

... где index представляет индекс элемента DataGrid, свойство «ЧК» вы хотите тест.

+0

Я не думаю, что это будет работать с несколькими рендерингами элементов в разных столбцах, скажем, мне нужен рендерер в другом столбце, как я могу это сделать? – mmattax

+0

Хорошая точка, да. Ответ Кристофа на самом деле лучше; Я использовал вышеупомянутый подход в списках с одним столбцом, без прокрутки и имел хорошие результаты, но то, что вы действительно ищете, не является ни свойством базовых данных, ни видимых отображаемых объектов, а скорее чем-то посередине , –

+0

Вы можете изменить свою вышеприведенную функцию, чтобы проверить как строку, так и столбец пользовательского Renderer ... someFunction (row: int, cell: int): void – AndrewB

2

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

пакет 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. Для обоих я слушаю в случае изменения и сохранения выбранных, 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

FANTASTIC. Функция indicesToItemRenderer() была именно тем, что я искал. Не могу поверить, что в DataGridBase уже ничего подобного нет, поскольку indexToItemRenderer() ListBase не учитывает столбцы! Благодарю. –

-1

В ItemRenderer, попробуйте положить Checkbox компонент в VBox .. разрешает проблему прокрутки.