Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Как сделать динамический ItemRenderer (http://www.flasher.ru/forum/showthread.php?t=130152)

chabapok 18.09.2009 22:58

Как сделать динамический 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 не назначается. Что я делаю не так и как надо?

wvxvw 19.09.2009 00:14

Попробуйте отнаследоваться от DataGridColumn и добавить ей такой функционал. Сам по себе этот класс того, что вы хотите делать не умеет. Т.е. итем-рендерер задается один раз для всей колонки.

chabapok 19.09.2009 00:43

Да, я уже понял, что не получится.На то оно и 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:55.

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