PDA

Просмотр полной версии : источник события в cellRender


mushtra
18.04.2007, 13:19
Есть трабла.
Есть экземпляр компонента DataGrid. Есть множество строк DataGrid с вложенными cellRender-ом клипами с экземпляром компонента Button.
Подскажите, как по событию click этого экземпляра компонента Button "отловить" индекс строки DataGrid, в которой находится этот источник события.

etc
18.04.2007, 13:47
А что, CellRenderer не знает свой индекс? А кто слушает click?

mushtra
18.04.2007, 13:49
А что, CellRenderer не знает свой индекс?
- Нет.
А кто слушает click?
- Хотел бы узнать...

etc
18.04.2007, 13:53
- Нет.
Правда? А getCellIndex для чего?

- Хотел бы узнать...
Супер. Т.е. вы отслеживаете click, но не знаете, кто является слушателем?

mushtra
18.04.2007, 14:00
Вы не поняли. Пусть слушает обработчик события на самой кнопке:
on(click){trace(this);}

А getCellIndex для чего?
http://livedocs.adobe.com/flash/mx2004/main_7_2/wwhelp/wwhimpl/common/html/wwhelp.htm?context=Flash_MX_2004&file=00002109.html

etc
18.04.2007, 14:07
Зачем вы мне ссылку даете на хелп по getCellIndex? Я опровергаю ваши слова, что CellRenderer не знает своего индекса, а вы мне суете ссылку на хелп. Зачем?

Использовать on, onClipEvent в данном случае нельзя. У вас должен быть класс, наследуемый от UIComponent, со всеми свойствами CellRenderer. Кроме этого, необходимо организовать подписку в классе на событие click экземпляра кнопки Button.

mushtra
18.04.2007, 14:49
Использовать on, onClipEvent в данном случае нельзя. У вас должен быть класс, наследуемый от UIComponent, со всеми свойствами CellRenderer. Кроме этого, необходимо организовать подписку в классе на событие click экземпляра кнопки Button.
Вы не доконца вникли в суть проблемы (или я не понял суть ответа).
Мне нужно установить индекс строки DataGrid в которой CellRenderer производит события изнутри самого CellRenderer. Не думаю, что расширение методов класса может дать нужный результат. Если Вы считаете свой совет правильным, поясните его.
Явление проблемы: если Вы смодулируете, то что я описал и последовательно сверху вниз будете кликать кнопки внутри CellRenderer, то trace покажет повторение идентичных, через каждые три строчки DataGrid, имён источников события. Надеюсь пояснил доходчиво...
И ещё. В данном случае нельзя подписать на одно событие весь CellRenderer. Т.е. в каждой строке DataGrid с CellRenderer находится несколько слушателей события click. Если Вы считаете нужным подсказать как это можно править, сделайте, пожалуйста, доходчиво.

И ещё. Если кого-то заинтересовала проблема. Я выложу код модели и трассировку.

etc
18.04.2007, 14:51
Советую вдумчиво изучить это:
http://livedocs.macromedia.com/flash/8/main/00003131.html

Потому как то, что вы написали, доходит до меня с трудом. Особенно «CellRenderer производит события изнутри самого CellRenderer».
Модулировать мне нечего, пример в хелпе описан. Если внятно объяснить не получается, показывайте исходник.

on, onClipEvent — нет этого в AS2. Не-ту. Это актуально было лет семь назад.

mushtra
18.04.2007, 15:20
...Если внятно объяснить не получается, показывайте исходник...
ОК! Только приведу его к скриптовому виду.

mushtra
18.04.2007, 17:58
Не получилось поместить всё в скрипт, по этому надо будет сделать мувик в библиотеке с идентификатором "cell" - это и будет слой.
На нем скрипт:

createClassObject(mx.controls.Button,"but",5,{label:"Test"});
var listener = {}
listener.click = function(evt){
trace(evt.target)
}
but.addEventListener("click",listener)

Скрипт на _root:

dp_dg = [{par0:"1"},{par0:"2"},{par0:"3"},{par0:"4"},{par0:"5"},{par0:"6"}]
createClassObject(mx.controls.DataGrid,"dg",1,{_width:300,_height:100,rowHeight:30});
dg.setStyle("alternatingRowColors", Array(0xEAEFF4, 0xF8FAFB));
newColumn = new mx.controls.gridclasses.DataGridColumn("par0");
newColumn.width = 90;
dg.addColumn(newColumn);
newColumn = new mx.controls.gridclasses.DataGridColumn("par1");
newColumn.cellRenderer = "cell"
newColumn.width = 300;
dg.addColumn(newColumn);
dg.dataProvider = dp_dg

При трассировке виден эффект о котором я говорил (при чём эффект не наблюдается, если высота DataGrid вмещает все данные)

Мне надо, чтобы трейс выводил индекс строки DataGrid, в которой расположен
CellRenderer

iNils
18.04.2007, 18:05
mushtra получает плюс за отсутствие тегов

mushtra
18.04.2007, 18:38
mushtra получает плюс за отсутствие тегов
Я, кажется, ничего не нарушил...
http://flasher.ru/forum/rules.php
и откуда +0.3?

[__etc: http://flasher.ru/forum/showthread.php?t=90042]

etc
18.04.2007, 18:47
Клип должен являться наследником UIComponent со всеми описанными свойствам, вы хелп про CellRendered API вообще читали?

з.Ы. Умолчу про то, что Array надо использовать как класс, а не как функцию (ещё один пережиток прошлого).

mushtra
18.04.2007, 19:15
...вы хелп про CellRendered API вообще читали?...
Да. Спасибо, я понял. Но если я укажу метод слушателя события в классе, мне всё-равно надо будет ссылаться на свойство "родительского" DataGrid, каким методом мне "отловить" это свойство?

etc
18.04.2007, 19:18
О каком свойстве родительского DataGrid речь идет? Какие слушатели? Зачем они, когда можно подписать сам CellRenderer на события кнопки? Метод getCellIndex() в кастомном CellRenderer будет описан DataGrid-ом при создании ячеек. Я вам крайне советую заглянуть в класс mx.controls.cells.CheckCellRenderer, может тогда вопросы отпадут (сомневаюсь, правда).

mushtra
19.04.2007, 13:15
__etc, спасибо за пояснения.