PDA

Просмотр полной версии : Проблема с CellRenderer и его содержимым


Max Stone
13.04.2010, 01:11
Объясняю свою проблему. Создаю таблицу DataGrid. В нем 2 колонки "Property" и "Value"
Передаю в таблицу DataProvider в котором описаны эти проперти, но value может быть разного типа (либо строка, либо число, либо булевская переменная).
Соответственно создаю свой класс CellRenderer для второго столбца, чтобы в зависимости от получаемого типа данных - отображался определенный контрол.
В случае с булевской - это чек бокс. В остальных - TextInput.
Чек бокс работает, а вот в textinput не набивается текст. Не хочет нивкакую. Курсор мигает, а текст не печатается. В качестве эксперимента на эту же сцену кинул TextInput, с теми же настройками - все работает. Значит либо DataGrid либо DataGridColumn каким-то образом блокирует ввод. Проводил отладку - свойство editable и enabled не меняются (true). Причем свойство editable менял как у DataGrid так и у DataGridColumn. В случае true просто появлялся CellEditor поверх и нормально работал. В общем нужно приDataGridColumn.editable = false;
чтобы TextInput работал как нужно. Подскажите советом, буду очень признателен.

Максимум нашел совет одного человека использовать rendererIsEditor= true, но это было бы здорово, если бы это не предназначалось для flex. Во flash такого к сожалению я не нашел.

Код первого кадра:
var myDataProvider:DataProvider = new DataProvider();
myDataProvider.addItem({Property: "Number", UndObject:{Type:"Number",value:15} });
myDataProvider.addItem({Property: "ComboBox", UndObject:{Type:"Boolean",value:1} });
myDataProvider.addItem({Property: "Number", UndObject:{Type:"Number",value:55} });

var myDataGrid:DataGrid = new DataGrid();
myDataGrid.setSize(500, 300);
myDataGrid.move(200, 50);
myDataGrid.allowMultipleSelection = false;
myDataGrid.editable = true;

var myFirstColumn:DataGridColumn = myDataGrid.addColumn("Property");
myFirstColumn.width = 150;
myFirstColumn.editable = false;

var mySecondColumn:DataGridColumn = myDataGrid.addColumn("Value");
mySecondColumn.width = 150;
mySecondColumn.cellRenderer = CustomCellRenderer;
mySecondColumn.editable = false;

myDataGrid.dataProvider = myDataProvider;

addChild(myDataGrid);

код класса:
public class CustomCellRenderer extends UIComponent implements ICellRenderer
{
private var _listData:ListData;
private var _data:Object;
private var _selected:Boolean;
private var types:Array = ["Boolean","Number","Count"];
private var Data:Object = {};
private var Bool:Boolean = false;
private var MytextInput:*;
private var Checkbox:*;

public function CustomCellRenderer()
{
super();
}

public function set data(d:Object):void
{
_data = d;
}

public function get data():Object
{
return _data;
}

public function get listData():ListData
{
return _listData;
}

public function set listData(value:ListData):void {
_listData = value;
Data = _data.UndObject;

if (types.indexOf(_data.UndObject.Type) == 1)//числовая
{

if (MytextInput == null)
{
MytextInput = new TextInput();
MytextInput.restrict = "0123456789.\\-";
MytextInput.maxChars = 10;
MytextInput.editable = true;
MytextInput.width = width;
MytextInput.height = height;
addChild(MytextInput);

}

if (Checkbox != null)
{
removeChild(Checkbox);
Checkbox = null;
}

MytextInput.text = String(Data.value);

}else if (types.indexOf(_data.UndObject.Type) == 0)///булевая
{

if (Checkbox == null)
{
Checkbox = new CheckBox();
Checkbox.width = width;
Checkbox.height = height;
Checkbox.label = "";
addChild(Checkbox);
Checkbox.addEventListener(MouseEvent.CLICK, onCheckClick);

}
Checkbox.selected = Boolean(Data.value);
Bool = Boolean(Data.value);

if (MytextInput != null)
{
removeChild(MytextInput);
MytextInput = null;
}

}else if (types.indexOf(_data.UndObject.Type) == 2) //каунт
{
////тут будет для счетчика
}
//рисуем фон и линию разделения
this.graphics.clear();
this.graphics.beginFill(0xFFFFFF);
this.graphics.drawRect(0,0,width,height);
this.graphics.lineStyle(1,0);
this.graphics.moveTo(0,height-1);
this.graphics.lineTo(width,height-1);

invalidate(InvalidationType.DATA);
invalidate(InvalidationType.STATE);
}


public function get selected():Boolean
{
return _selected;
}
public function set selected(b:Boolean):void
{
_selected = b;
invalidate(InvalidationType.STATE);
}
public function setMouseState(state:String):void
{

}

}


П.С. Перед уходом появилась мысль, может стоит использовать не CellRenderer, а сразу CellEditor свой? В нем выводить либо чек бокс либо textinput в зависимости от типа. только тогда нужно ему передать этот тип, а каким образом? Плюс в него же надо будет передать тогда еще максимальные и минимальные значения, для проверки правильности ввода (по условию задачи).

Добавлено через 19 часов 2 минуты
Господа, неужели никто не знаком с этими классами? Буду рад любым наводкам.

ERrorMAKros
30.09.2010, 01:56
Как обычно (на собственном опыте) мало кто на этом форуме любит отвечать на вопросы по dataGrid. В итоге вроде получается решить реализацию своими силами, ...и зачастую с сомнениями - правильно ли оно работает, ...ах, ну коль работает то и сто лет еще пускай работает )))

Max Stone
30.09.2010, 19:14
Я в итоге написал свою таблицу. Левый столбец TextField, а в правом отображалось то что мне нужно. Работает уверенно =) хоть и функционал не огромный.