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 минуты
Господа, неужели никто не знаком с этими классами? Буду рад любым наводкам.
Передаю в таблицу 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 минуты
Господа, неужели никто не знаком с этими классами? Буду рад любым наводкам.