Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.04.2010, 01:11
Max Stone вне форума Посмотреть профиль Отправить личное сообщение для Max Stone Найти все сообщения от Max Stone
  № 1  
Ответить с цитированием
Max Stone

Регистрация: Mar 2009
Сообщений: 7
По умолчанию Проблема с CellRenderer и его содержимым

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

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

Код первого кадра:
Код AS3:
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);
код класса:
Код AS3:
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.
Старый 30.09.2010, 01:56
ERrorMAKros вне форума Посмотреть профиль Отправить личное сообщение для ERrorMAKros Посетить домашнюю страницу ERrorMAKros Найти все сообщения от ERrorMAKros
  № 2  
Ответить с цитированием
ERrorMAKros
 
Аватар для ERrorMAKros

Регистрация: May 2008
Адрес: Земля.Украина.Одесса
Сообщений: 219
Отправить сообщение для ERrorMAKros с помощью ICQ Отправить сообщение для ERrorMAKros с помощью Skype™
Как обычно (на собственном опыте) мало кто на этом форуме любит отвечать на вопросы по dataGrid. В итоге вроде получается решить реализацию своими силами, ...и зачастую с сомнениями - правильно ли оно работает, ...ах, ну коль работает то и сто лет еще пускай работает )))

Старый 30.09.2010, 19:14
Max Stone вне форума Посмотреть профиль Отправить личное сообщение для Max Stone Найти все сообщения от Max Stone
  № 3  
Ответить с цитированием
Max Stone

Регистрация: Mar 2009
Сообщений: 7
Я в итоге написал свою таблицу. Левый столбец TextField, а в правом отображалось то что мне нужно. Работает уверенно =) хоть и функционал не огромный.

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:22.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 19:22.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.