![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Mar 2009
Сообщений: 7
|
Объясняю свою проблему. Создаю таблицу DataGrid. В нем 2 колонки "Property" и "Value"
Передаю в таблицу DataProvider в котором описаны эти проперти, но value может быть разного типа (либо строка, либо число, либо булевская переменная). Соответственно создаю свой класс CellRenderer для второго столбца, чтобы в зависимости от получаемого типа данных - отображался определенный контрол. В случае с булевской - это чек бокс. В остальных - TextInput. Чек бокс работает, а вот в textinput не набивается текст. Не хочет нивкакую. Курсор мигает, а текст не печатается. В качестве эксперимента на эту же сцену кинул TextInput, с теми же настройками - все работает. Значит либо DataGrid либо DataGridColumn каким-то образом блокирует ввод. Проводил отладку - свойство editable и enabled не меняются (true). Причем свойство editable менял как у DataGrid так и у DataGridColumn. В случае true просто появлялся CellEditor поверх и нормально работал. В общем нужно при чтобы 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 минуты Господа, неужели никто не знаком с этими классами? Буду рад любым наводкам. Последний раз редактировалось Max Stone; 13.04.2010 в 01:26. |
|
|||||
|
Как обычно (на собственном опыте) мало кто на этом форуме любит отвечать на вопросы по dataGrid. В итоге вроде получается решить реализацию своими силами, ...и зачастую с сомнениями - правильно ли оно работает, ...ах, ну коль работает то и сто лет еще пускай работает )))
|
|
|||||
|
Регистрация: Mar 2009
Сообщений: 7
|
Я в итоге написал свою таблицу. Левый столбец TextField, а в правом отображалось то что мне нужно. Работает уверенно =) хоть и функционал не огромный.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 19:22. |
|
|
« Предыдущая тема | Следующая тема » |
|
|