PDA

Просмотр полной версии : CheckBox и Image в ячейке DataGrid


asuri
12.02.2007, 19:20
Добрый день.
Имеется DataGrid заполняемый динамически из xml через URLLoader.
Потом добавляется ещё несколько колонок(опять таки через экшнскрипт, не в mxml коде). Вобщем всё генерится динамически.
Мне необходимо вставить в каждую ячейку одной из колонок какой-то компонент, чекбокс или имидж. Такой же компонент надо вствить и в head колонки.
Нашел несколько подобных примеров, но там используется вставкка компонента прямо в mxml, а мне надо динамически.
Вобщем за помощь буду очень признателен ))

Nirth
13.02.2007, 03:18
Нужно создать сначала свой ItemRenderern (в Flex Developer Guide -> Customizing User Interface есть статьи и по MXML и по AS)

Далее тебе нужно через фабрику, установить рендерер, вроде


myDataGridCollumn.itemRenderer = new ClassFactory(MyItemRendererClass);

asuri
13.02.2007, 15:39
Спасибо помогло, но теперь у меня возникла другая проблема.
Для начаа опишу то что получилось на данный момент:
есть датагрид у которого в колонках стоит компонент headerCheck(на основе чекбокса), а в строках другой компонент itemCheck(тоже на основе чекбокса).
Мне надо реализовать функцию типа "отметить все". То есть при переключении чекбокса headerCheck, надо переключатьв соответствующее положение все чекбоксы в строках (itemCheck).

На данный момент представляю себе несколько решений:

1) Создать в компоненте itemCheck функцию selectAll() и вызывать её при переключении чекбокса в headerCheck. Но так не получается, потому что из компонента headerCheck не видна функция находящаяся в itemCheck.[Bindable] не помогает.
2) Создать такую функцию прямов headerCheck, и она будет переключать чекбоксы в itemCheck. Но не понятно как к этим чекбоксам обратиться.

может есть какая то функция наподобие document.getElementById() в javascript ??

__i
13.02.2007, 16:02
логичнее всего управлять нужно из датапровайдера, т.е. в датапровайдере скидываешь все "галки", а рендеры должны автоматом обновиться (гы гы если ты это реализовал).

Добро пожаловать в мир кастомных айтемрендеров, вас ждет незабываемая бесконечная долгая любовь, постигнув которую вы обретете покой...

asuri
13.02.2007, 16:07
Чё то не сильно понятно.
Попробую сам разобраться, только ответьте мне на такой вопрос.
Как мне из компонента обратиться к объекту или переменной которая определена как public в родительском апликейшене??? Я из компонента вообще не вижу никких переменных апликейшена. Как с этим бороться? Опять же [Bindable] не помогает (

__i
13.02.2007, 17:05
смотри, ща я буду показывать мега фокусы(пошагово %) ):

шаг 1, делаем описание наших данных:

package
{
import flash.events.IEventDispatcher;
import flash.events.EventDispatcher;
[Bindable]
public class ItemVO extends EventDispatcher
{
public var label : String;
public var checked : Boolean;
}
}


Шаг 2. делаем атем рендер "заточеный" под наши данные:

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="100" height="20">
<mx:CheckBox id="checker" label="{data.label}" selected="{data.checked}" change="{data.checked = checker.selected}" />
</mx:Canvas>


Шаг номер 3, наша мега аппликуха:

<?xml version="1.0" encoding="utf-8"?>
<!-- Tree control example. -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*" layout="vertical">
<mx:Script>
<![CDATA[
public function clearItems() : void
{
for (var i : Number=0; i<arcoltest.length; i++)
{
arcoltest.getItemAt(i).checked = false;
}
}
]]>
</mx:Script>
<mx:ArrayCollection id="arcoltest">
<local:ItemVO label="qewqw" checked="true" />
<local:ItemVO label="1" checked="true" />
<local:ItemVO label="2" checked="true" />
<local:ItemVO label="1231" checked="true" />
<local:ItemVO label="qweqwe" checked="true" />
</mx:ArrayCollection>
<mx:List dataProvider="{arcoltest}" itemRenderer="CheckBoxItemRender" />

<mx:Button label="Clear all" click="clearItems()"/>

</mx:Application>


Усе фокус готов, ловкость рук и никакого мошенничества )

Narf31
28.01.2009, 17:24
этот код попонятней


<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">


<mx:Script>
<![CDATA[
import mx.controls.Alert;

import mx.collections.ArrayCollection;


private function click():void {
for (var i : Number=0; i<myDP.length; i++)
{
var o:Object = myDP.getItemAt(i);
o.Sent = false;
myDP.setItemAt(o, i);
}



}

[Bindable]
private var myDP:ArrayCollection = new ArrayCollection([
{City:"Все регионы", Sent:true},
{City:"Альметьевск", Sent:true},
{City:"Астрахань", Sent:true},
{City:"Альметьевск", Sent:true},
{City:"Волгоград", Sent:true},
{City:"Волжский", Sent:true},
{City:"Вологда", Sent:true}
]);



]]>
</mx:Script>

<mx:DataGrid id="myDG"
dataProvider="{myDP}"
variableRowHeight="true"
width="474" height="250"
editable="true" horizontalCenter="24" y="10">
<mx:columns>
<mx:DataGridColumn dataField="Sent"
headerText=" "
itemRenderer="mx.controls.CheckBox"
rendererIsEditor="true"
width="25"
editorDataField="selected"/>
<mx:DataGridColumn dataField="City"
headerText=" "
editable="false"/>

</mx:columns >
</mx:DataGrid>

<mx:Button click="click()">

</mx:Button>


</mx:Application>

etc
28.01.2009, 17:27
Некропостинг у нас не в почёте, кроме того, код нужно оформлять тегами .