PDA

Просмотр полной версии : Датагрид и вставленная в неё кнопка


lighto
26.03.2010, 09:27
<mx:DataGrid left="10" top="41" right="10" bottom="10" dataProvider="{bookz}" id="DG" change="ShowImage()">
<mx:columns>
<mx:DataGridColumn headerText="Код" width="30" dataField="id"/>
<mx:DataGridColumn headerText="Название книги" width="300" dataField="name"/>
<mx:DataGridColumn dataField="Скачать" width="50">
<mx:itemRenderer>
<mx:Component>
<mx:Button label="скачать" click="Downl();"/>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>

Есть датагрид с вставленной в неё кнопкой, когда вешаю на клик функцию click="Downl();"
пишет 1180: Вызов предположительно неопределенного метода Downl.
вот функция

public function Downl():void
{
if (DG.selectedIndex==-1)
{
Alert.show('Выберите из списка книгу, которую Вы хотите загрузить');
return;
}
init(progBar,btn1);
CheckFileInInternet();
}

что я делаю нетак??? :umnik2: а если пробую функцию сделать статичной но вообще выдает непонятно что.... Спасибо тем кто прочитает и ответит :)

Кип
26.03.2010, 09:32
Считай, что

<mx:itemRenderer>
<mx:Component>
<mx:Button label="скачать" click="Downl();"/>
</mx:Component>
</mx:itemRenderer>

это отдельный документ. Чтобы обратиться к основному документу, можешь использовать outerDocument:
<mx:Button label="скачать" click="outerDocument.Downl();"/>

lighto
26.03.2010, 09:52
Ага это да это теперь понятно я так и догадывался но теперь он выдает еще лучше
1061: Обращение к возможно неопределенному методу Downl через ссылку статического типа Class. ставлю статичной функцию он выдает кучу ошибок что незнает такое что внутри функции... и как это решить?

bastrakov
26.03.2010, 09:59
лично мне это очень не понравилось... :-(



<mx:DataGridColumn dataField="dg3">
<mx:itemRenderer>
<mx:Component>
<mx:Canvas width="100%" >

<mx:Script>
<![CDATA[
import mx.controls.Alert;
private function showAlert():void
{
Alert.show(data.dg3);
}
]]>
</mx:Script>

<mx:Label id="dg3text"
text="{data.dg3}"
/>
<mx:Button alpha="-1"
height="95%" width="95%" click="{showAlert()}"
/>

</mx:Canvas>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>


к слову. гораздо удобнее делать отдельным компонентом и его вставлять здесь. во

lighto
26.03.2010, 10:03
Ага я это думал но проблемма в том что в функции идет обращение к тем компонентам(кнопки и тд) и он же опять выдаст ошибку я уверен... должен же быть способ вызывать его незасовывая пол приложеня внутрь итемрендера... есть такое или нет? и все же попробую вдруг выйдет) хатя врядли)

Добавлено через 13 минут
ага ошибка та же что и тогда когда пробовал сделать функцию статичной((... блин а можно сделать одну функцию которая сама может читать все приложение и приложение с любого места её видет типа global иль еще как то?

BeDLiNt
26.03.2010, 15:31
Диспатчте своё событие по клику, а снаружи ловите.

lighto
29.03.2010, 09:11
Диспатчте своё событие по клику, а снаружи ловите.
А можно коротеньки пример а то что то непойму

BeDLiNt
29.03.2010, 09:22
Ну напишите свой итемРендерер, и в нём по клику шлите событие, что по кнопке кликнули. Событие конечно и так шлется, стандратное флексовое всплывающее MouseEvent.CLICK. Можете конечно и его ловить, но ловить его Вам надо будет на уровне датагрида, а у него и его компонентов так же есть это событие и Вам надо будет разбираться, кто именно его послал, можно, но не верно.
Поэтому лучше использовать своё собственное, где вы можете передать в проперти нужные Вам данные. Т.к. листенера Вы не сможете повешать на Вашу кнопку извне потому что у Вас нет там на него ссылки, то можно использовать всплывающее(bubbles) событие, и тогда его можно ловить на уровне датагрида.
Вот собственно и все. В рендерере по клику dispatch. У датагрида addEventListener.

lighto
29.03.2010, 11:02
:rolleyes:блин некогда неработал с этими dispatch очень прошу пример или ссылку на него

Кип
29.03.2010, 11:15
Выносишь itemRenderer в отдельный файл, вешаешь в нём обработчик MouseEvent.CLICK, в обработчике пишешь:

dispatchEvent(new Event("itemRendererClicked", true));


В основном классе на датагрид вешаешь addEventListender("itemRendererClicked", твояФункция)

BeDLiNt
29.03.2010, 11:27
:rolleyes:блин некогда неработал с этими dispatch очень прошу пример или ссылку на него
Ну дык работайте, справку читайте. Как можно работать с Флекс и не использовать его главные фишки: события(к фишке скорее относятся именно всплывающие) и биндинг.

lighto
29.03.2010, 15:29
Выносишь itemRenderer в отдельный файл, вешаешь в нём обработчик MouseEvent.CLICK, в обработчике пишешь:

dispatchEvent(new Event("itemRendererClicked", true));


В основном классе на датагрид вешаешь addEventListender("itemRendererClicked", твояФункция)
Вродеб работает но я наверное что то нетак делаю((( потому что работает вне зависимости от того нажата ли кнопка или нет(
это itemRenderer и диспатч мне кажеться я тут что то нето сделал да?:rolleyes:

<mx:itemRenderer>
<mx:Component>
<mx:Button label="скачать" click="
dispatchEvent(new Event('itemRendererClicked',true));
"/>
</mx:Component>
</mx:itemRenderer>

это функция с листенером

public function Dow():void
{
DG.addEventListener('itemRendererClicked',Downlo(),false, 1);
}

1)да и на что вешать её? на клик по датегрид тогда невозможно работать с датагридом...???
2)а выполняеться она почему то вне зависимости от того кликнули ли кнопку или нет... может кто подскажет как бороться с этим...
P.S блин насколько было бы проше еслибы функции были видны из всех файлов :)

BeDLiNt
29.03.2010, 15:44
это функция с листенером
Это не функция с листенером, это вы посписываетесь на событие 'itemRendererClicked'. Подписаться на него надо заранее, допустим по creationComplete.

lighto
29.03.2010, 15:53
спасибо за пояснение, если вешаешь на creationComplete, тогда он как будто невидит что я подписался на событие или я как то не так подписался? кликаешь на кнопку и нечего непроисходит....

BeDLiNt
29.03.2010, 15:58
Покажи код.

lighto
29.03.2010, 16:06
Дата грид и итемрендер

<mx:DataGrid left="10" top="41" right="10" bottom="10" dataProvider="{bookz}" id="DG" change="ShowImage();" creationComplete="Dow()" >
<mx:columns>
<mx:DataGridColumn headerText="Код" width="30" dataField="id"/>
<mx:DataGridColumn headerText="Название книги" width="300" dataField="name"/>
<mx:DataGridColumn headerText="Автор/Под редакцией" width="150" dataField="avtor"/>
<mx:DataGridColumn headerText="Год издания" width="70" dataField="god"/>
<mx:DataGridColumn headerText="Место издания" width="70" dataField="mestoizd_name"/>
<mx:DataGridColumn headerText="Скачать" width="50" id="date111">
<mx:itemRenderer>
<mx:Component>
<mx:Button label="скачать" click="dispatchEvent(new Event('itemRendererClicked',true));"/>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>



public function Dow():void
{
DG.addEventListener('itemRendererClicked',Downlo(),false, 1);
}

function Downlo()
{
if (DG.selectedIndex==-1)
{
Alert.show('Выберите из списка книгу, которую Вы хотите загрузить');
return;
}
init(progBar,btn1);
CheckFileInInternet();
}

он не видит подписи на событие так?

BeDLiNt
29.03.2010, 16:18
Попробуй так:

<mx:Button id="loadButton" label="скачать" click="loadButton.dispatchEvent(new Event('itemRendererClicked',true));"/>

lighto
29.03.2010, 16:21
id attribute is not allowed on the root tag of a component
вот такая вот ошибка выходит :umnik2: я это уже пробовал блин это что то непонятное..
ему нельзя присвоить айди а по умолчанию у него какой айди должен же какой нить быть? или может вообше все неправильно?

BeDLiNt
29.03.2010, 16:38
Всё работает. Вот накидал пример:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
minWidth="955" minHeight="600">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.events.FlexEvent;

protected function dg_creationCompleteHandler(event:FlexEvent):void
{
dg.addEventListener("loadClickEvent", loadClickHandler);
}

protected function loadClickHandler(event:Event):void
{
mx.controls.Alert.show("Load Click!");
}
]]>
</mx:Script>

<mx:XMLList id="employees">
<employee>
<name>Christina Coenraets</name>
<phone>555-219-2270</phone>
<email>ccoenraets@fictitious.com</email>
<active>true</active>
</employee>
<employee>
<name>Joanne Wall</name>
<phone>555-219-2012</phone>
<email>jwall@fictitious.com</email>
<active>true</active>
</employee>
<employee>
<name>Maurice Smith</name>
<phone>555-219-2012</phone>
<email>maurice@fictitious.com</email>
<active>false</active>
</employee>
<employee>
<name>Mary Jones</name>
<phone>555-219-2000</phone>
<email>mjones@fictitious.com</email>
<active>true</active>
</employee>
</mx:XMLList>

<mx:DataGrid id="dg" width="100%" height="100%" rowCount="5"
dataProvider="{employees}"
creationComplete="dg_creationCompleteHandler(event)">
<mx:columns>
<mx:DataGridColumn dataField="name" headerText="Name" />
<mx:DataGridColumn dataField="phone" headerText="Phone" />
<mx:DataGridColumn dataField="email" headerText="Email" />
<mx:DataGridColumn>
<mx:itemRenderer>
<mx:Component>
<mx:Button label="load"
click="{dispatchEvent(new Event('loadClickEvent', true))}" />
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>

</mx:Application>

lighto
29.03.2010, 17:01
BeDLiNt ОГРОМНОЕ СПАСИБО ... все дело то в скобках (event:Event) вот блин а сам бы некогда неподумал что там все это))) спасибо)