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

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

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

Регистрация: Jul 2009
Сообщений: 240
Записей в блоге: 1
По умолчанию Как сделать динамический ItemRenderer

У меня есть сводная таблица, в которой я хочу хранить разнообразные обьекты. dataProvider этой таблицы я забиндил со статической переменной класса bookmark.
У каждого объекта, есть кнопочка "добавиться в массив bookmark"
Это все работает - объекты добавляются в массив нормально.

Проблема только в том что itemRenderer разный нужен для разных ячеек. И вот это не работает.

вот это моя таблица:
Код AS1/AS2:
<mx:DataGrid x="0" y="0" width="582" height="446" 
	dataProvider="{bookmarks.spisok}">
	<mx:columns>
	<mx:DataGridColumn headerText="data" dataField="myitem" itemRenderer="{data.myitemrenderer}"/>
	</mx:columns>
</mx:DataGrid>
а вот мой класс:
Код AS1/AS2:
[Bindable]
public class bookmarks{
	public static var spisok:ArrayCollection = new ArrayCollection();
	public static function addBmrk(item:*, renderer:*):void{
		spisok.addItem({
			myitem:item,
			myitemrenderer:new String(renderer)
		});
	}
}
а вот так объекты добавляют себя в список. в обьекте есть вот такая кнопочка:
Код AS1/AS2:
<mx:Image 	click="{ bookmarks.addBmrk(this, this.className) }"/>

не работает. itemRenderer не назначается. Что я делаю не так и как надо?

Старый 19.09.2009, 00:14
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Попробуйте отнаследоваться от DataGridColumn и добавить ей такой функционал. Сам по себе этот класс того, что вы хотите делать не умеет. Т.е. итем-рендерер задается один раз для всей колонки.
__________________
Hell is the possibility of sanity

Старый 19.09.2009, 00:43
chabapok вне форума Посмотреть профиль Отправить личное сообщение для chabapok Найти все сообщения от chabapok
  № 3  
Ответить с цитированием
chabapok

Регистрация: Jul 2009
Сообщений: 240
Записей в блоге: 1
Да, я уже понял, что не получится.На то оно и Column, что задает всю колонку по одному образцу.

Это нужен mx:VBox и обьекты надо добавлять туда. Он может содержать разные обьекты. Я даже попробовать успел - не работает Но все равно VBox - это правильней

теперь у меня так:
Код AS1/AS2:
<mx:VBox id="myVbox" creationComplete="myVboxConfListeners()"/>
...
private function myVboxConfListeners():void{
	bookmarkEvent.dispatcher.addEventListener(bookmarkEvent.AddBookmark,
		function(ev:*=null):void{
			myVbox.addChild(bookmarkEvent.data );
		}
	);
}
Код AS1/AS2:
public class bookmarkEvent{
	public static const AddBookmark:String="addBkmrkEvent";
 
	public static var dispatcher:EventDispatcher=new EventDispatcher();
	public static var data:*;
 
	public static function newBkmrk(obj:*):void{
		data=obj;
		dispatcher.dispatchEvent(new Event(AddBookmark) );
	}
Вызывается так:
Код AS1/AS2:
<mx:Image 	click="{ bookmarkEvent.newBkmrk(this) }"
При этом выскакивает ошибка.
Код AS1/AS2:
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
	at mx.controls.dataGridClasses::DataGridBase/itemRendererToIndices()[C:\autobuild\galaga\frameworks\projects\framework\src\mx\controls\dataGridClasses\DataGridBase.as:2679]
	at mx.controls.listClasses::ListBase/mouseOverHandler()[C:\autobuild\galaga\frameworks\projects\framework\src\mx\controls\listClasses\ListBase.as:8788]
Cам myVbox у меня на другой вкладке TabNaviigator-а, нежели объект, который добавляет себя. Кстати, несмотря на ошибку, обьект появляется на той вкладке, только почему-то он туда переносится из текущей. Надо его как-то клонировать, видимо. Видимо и ошибка поэтому возникает.

Добавлено через 1 час 20 минут
вобщем он не клонируется
я пробовал его клонировать через ByteArray - не получается.
пробовал через mx.utils.objectUtil.copy - тоже не вышло

попробовал в обьекте, который себя добавляет, определить функцию

Код AS1/AS2:
public function clone() : person{var p:person= new person(); return p;	}
получилось, но свойства нового обьекта настроить не получается. Как только я пытаюсь настраивать комбобоксы и текстарии в переменной p -- вылетает ошибка "Не удается вызвать свойство или метод со ссылкой на объект "null".

Добавлено через 1 час 48 минут
проблема наверное в том, что компонент, который я хочу добавить "в закладку" является не полноценным компонентом, а itemRenderer-ом. У него свойства прописаны как text="{data.name}". Может, поэтому не получается. хз

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

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

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


 


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


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