PDA

Просмотр полной версии : Динамический Accordion и DataGrid


Anaza
07.04.2009, 19:08
Идея такая. Считывается с БД сколько существует групп и делается чтолько же вкладок accordion, а каждая вкладка заполняется dataGrid.

Проблема не могу корректно передать в dataGrid itemRender. Как это сделать.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
pageTitle="Student"
creationComplete="init()"
xmlns:comp="components.*"
width="416">

<mx:Script>
<![CDATA[
import valueObjects.Student;
import valueObjects.Group;
import mx.collections.ArrayCollection;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
import mx.controls.Alert;
import mx.containers.VBox;
import mx.controls.DataGrid;
import mx.controls.dataGridClasses.DataGridColumn;

[Bindable]
public var stud:Student;

[Bindable]
public var group:Group;

[Bindable]
public var dataGr:DataGrid;

[Bindable]
public var groupData:ArrayCollection;

[Bindable]
public var studData:ArrayCollection;

private function init():void{
doGet.send();
getGroup.send();
stud = new Student();
group = new Group();
}

private function resultHandler(event:ResultEvent):void{
studData = new ArrayCollection();
var studResultData:ArrayCollection = event.result.students.student;
var resultLength:Number = studResultData.length;
for (var i:Number = 0; i < resultLength; i++){
var tempObject:Student1 = new Student1();
tempObject.id = studResultData.getItemAt(i).partyId;
tempObject.name = studResultData.getItemAt(i).firstName;
studData.addItem(tempObject);
}
}

private function resultGroupHandler(event:ResultEvent):void{
groupData = new ArrayCollection();
var groupResultData:ArrayCollection = event.result.groups.group;
var resultLength:Number = groupResultData.length;
for (var i:Number = 0; i < resultLength; i++){
var tempObject:Group = new Group();
tempObject.groupId = groupResultData.getItemAt(i).groupId;
tempObject.courseName = groupResultData.getItemAt(i).courseName;
groupData.addItem(tempObject);

//Создание элемента для accordian
var vbox:VBox = new VBox();
vbox.label = tempObject.courseName;
vbox.percentWidth = 416;
vbox.percentHeight = 451;

//Создание dataGrid
dataGr = new DataGrid();
var dgcolumns:Array = new Array();
var dgcolumn1:DataGridColumn = new DataGridColumn();

dataGr.percentWidth = 416;
dataGr.percentHeight = 451;
dataGr.dataProvider = studData;
dataGr.columns = dgcolumns;

//Необходимо чтоб dataGrid состоял из itemRenderer="components.EmployeeRenderer", таким образом оно не работает ((
var employeeRenderer:ClassFactory = new ClassFactory(EmployeeRenderer);
dgcolumn1.itemRenderer = employeeRenderer;
dgcolumns.push(dgcolumn1)

vbox.addChild(dataGr);

accordion.addChild(vbox);
}

}

private function faultHandler(event:FaultEvent):void{
Alert.show("Where was a problem.","Error");
}
]]>
</mx:Script>

<mx:HTTPService id="doGet"
url="http://localhost:8080/bimportal/control/getFlexStudent" method="POST"
result="resultHandler(event)"
fault="faultHandler(event)"/>

<mx:HTTPService id="getGroup"
url="http://localhost:8080/bimportal/control/getFlexGroup" method="POST"
result="resultGroupHandler(event)"
fault="faultHandler(event)"/>

<mx:Accordion id="accordion" width="414" height="451">
</mx:Accordion>

</mx:Application>

Tim SharK
08.04.2009, 11:13
А как ты понимаешь, что есть проблема ?
Ошибка компиляции или отображается не то, что нужно ?
Было бы неплохо увидеть скриншот, если отображается не то, что нужно.

Добавлено через 10 минут
кстати, попробуй для начала сделать DataGrid с одним только столбцом и заполни его каким-нибудь статическим текстом. Так легче будет понять где ошибка!

Anaza
08.04.2009, 11:49
Проблема в том, что данные не отображаются (или не отображаются как надо).

Если убрать вставку itemRenderer,


dataGr.columns = dgcolumns;

var employeeRenderer:ClassFactory = new ClassFactory(EmployeeRenderer);
dgcolumn1.itemRenderer = employeeRenderer;
dgcolumn1.dataField = "groupId";
dgcolumns.push(dgcolumn1);


то получиться такой вид

http://s58.***********/i159/0904/d7/4bc90f6cf1cbt.jpg (http://***********/F/s58.***********/i159/0904/d7/4bc90f6cf1cb.jpg.html)

Если вставить его, то данные не отображаются совсем. А хотелось бы что б была на подобии

http://s41.***********/i092/0904/2d/f64e3e70a7cbt.jpg (http://***********/F/s41.***********/i092/0904/2d/f64e3e70a7cb.jpg.html)

PS Если делаю даже одну колонку в гриде, то данные так же перестаю отображаться :(

Tim SharK
08.04.2009, 11:53
на вотором изображении не datagrid, а List.
Кроме того List проще сделать.
Попробуй List сделать, вместо DataGrid.

Или нужно конкретно DataGrid из-за возможности видеть каждый параметр в своем столбце ?


кстати, не зная что значит для тебя правильное отображение данных в твоем DataGrid, тебе никто не сможет помочь. Объясни чем тебя не устраивает вид на первом скриншоте ?

Anaza
08.04.2009, 12:24
Вид не устраивает тем что он не удобен для просмотра пользователем.

На второй картинке именно DataGrid

<mx:DataGrid id="employeeGrid"
dataProvider="{gridData}" x="22" y="20"
itemClick="itemClickHandler(event)" height="465">
<mx:columns>
<mx:DataGridColumn itemRenderer="components.EmployeeRenderer"/>
</mx:columns>
</mx:DataGrid>

Лист можно попробовать, но основная проблема при этом не исчезнет, а она в том, чтоб вставить <mx:DataGridColumn itemRenderer="components.EmployeeRenderer"/> в код из первого поста. Там немного по другому добавляются данные из-за того что приходится динамически создавать accordion.

GBee
08.04.2009, 12:39
Проблема в EmployeeRenderer. Покажите?

Anaza
08.04.2009, 13:02
Показать EmployeeRenderer я правильно поняла?

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"
horizontalAlign="absolute"
initialize="init()"
width="100%" height="96" verticalScrollPolicy="off">

<mx:Script>
<![CDATA[
import valueObjects.Student;
import flash.net.URLLoader;
import flash.net.URLRequest;


[Bindable]
private var imagePath:String;

private var loader:URLLoader;

private function init():void{
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, loaderHandler);
loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
}

private function loaderHandler(success:String):void{
if (success){
imagePath = "foto/" + data.image;
}
}

private function ioErrorHandler(event:IOErrorEvent):void{
imagePath = "foto/2400.jpg";
}

override public function set data(value:Object):void{
super.data = value;
var requestURL:URLRequest = new URLRequest("foto/" + data.image);
loader.load(requestURL);
}
]]>
</mx:Script>
<mx:Image
source="{imagePath}" width="80"/>
<mx:VBox horizontalScrollPolicy="off" height="96">
<mx:Label text="{data.name} {data.fatherName} {data.surname}" fontWeight="bold" fontSize="12"/>
<mx:Label text="Группа: {data.studGroup}"/>
<mx:Label text="Email: {data.email}"/>
<mx:Label text="Тел: {data.mobile}"/>
</mx:VBox>
</mx:HBox>

GBee
08.04.2009, 13:09
Вроде все ок, только картинку через одно место грузите, просто в сурс путь запихнуть не судьба?

Tim SharK
08.04.2009, 13:11
Все-таки что значит "неудобен для просмотра пользователем" ? Размеры столбцов другие нужны ? Или их порядок ? :)

Anaza
08.04.2009, 13:24
Вроде все ок, только картинку через одно место грузите, просто в сурс путь запихнуть не судьба?

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

Все-таки что значит "неудобен для просмотра пользователем" ? Размеры столбцов другие нужны ? Или их порядок ?

Количество (нужно выводить не все столбцы), порядок (сначал имя, фамилия и пр), размер соответственно и нужна ФОТКА. Хотя как говорила если добавлять текст с колонкой то данные перестают отображаться.

Мне хоть как то это отформатировать :wacko:

GBee
08.04.2009, 13:57
Image сам может событие ошибки генерить, да и можно скин сделать незагруженной картинки.
А насчет отображения данных, не знаю что посоветовать.

Попробуйте задавать датапровайдер после создания колонки
Покажите хмл или объект какой у вас приходит от сервера?

Tim SharK
08.04.2009, 15:56
Покажи скриншот, когда ничего не добавляет :)

Anaza
08.04.2009, 18:18
http://i001.***********/0904/8d/628b2635d06bt.jpg (http://***********/F/i001.***********/0904/8d/628b2635d06b.jpg.html)
Как можно заметить там есть пустая панелька от dataGrid с названием.

И еще, по идее если бы была проблема с передачей именно данных то было бы раскрашено в полоску как тут.
http://s48.***********/i121/0904/a4/ec4bb75be302t.jpg (http://***********/F/s48.***********/i121/0904/a4/ec4bb75be302.jpg.html)

GBee
08.04.2009, 19:42
данные то покажите кусочек?

Tim SharK
08.04.2009, 19:48
попробуй Inline Item Renderer

Если не в курсе, это вот так:
<mx:List id="myList" dataProvider="{waccountXMLLC}" width="{parent.width - 18}" verticalScrollPolicy="on" height="100%"
variableRowHeight="true" wordWrap="true">
<mx:itemRenderer>
<mx:Component>
<mx:HBox>
<mx:Text text="{data.date}" width="9.5%"/>
<mx:List id="myList2" x="100" width="80%" height="100%" dataProvider="{data.item}"
variableRowHeight="true" wordWrap="true" verticalScrollPolicy="on">
<mx:itemRenderer>
<mx:Component>
<mx:HBox>
<mx:Image source="accountIcons/{data.type}.gif" height="36" width="36"/>
<mx:Text text="{data.name}" width="90%"/>
<mx:Text text="{data.cost}" paddingLeft="1"/>
</mx:HBox>
</mx:Component>
</mx:itemRenderer>
</mx:List>
<mx:Text text="{data.sumcost}" left="0" paddingLeft="1"/>
</mx:HBox>
</mx:Component>
</mx:itemRenderer>
</mx:List>

Добавлено через 1 минуту
а попробуй в коде itemrenderer'a строку dataGr.columns = dgcolumns; поместить ниже dgcolumns.push(dgcolumn1);

Anaza
08.04.2009, 19:56
а попробуй в коде itemrenderer'a строку dataGr.columns = dgcolumns; поместить ниже dgcolumns.push(dgcolumn1);

:eek: заработало

Все теперь прекрасно выглядит и отображается :yahoo:

СпАсИбО :drinks::drinks::drinks::drinks::drinks:

PS жаль что тут нет смайлов с поцелуями. Форум видно не расчитан на девушек.

Tim SharK
08.04.2009, 20:23
пожалуйста :)

Aldegran
30.07.2009, 19:25
Люди добрые. Подскажите как решить такую траблу по аккордеону:
Изначально в аккордеоне есть 3 плашки и 1 из них выбрана по умолчанию. Еслм переключится на вторую то при выезде её содержимое не показывается а показывается только после того как она полностью выехала. самое интересное сто если эту плашку закрыть а потом открыть снова то всё плавно выезжает как и надо. такое чувство что изначально до первого обращения они не вставлены в сцену.
код простейший.
<mx:Accordion x="10" y="412" width="200" height="200">
<mx:Canvas label="Accordion Pane 1" width="100%" height="100%">
<mx:Label text="Accordion container panel 1"/>
</mx:Canvas>
<mx:Canvas label="2" width="100%" height="100%">
<mx:Label text="Accordion container panel 1"/>
</mx:Canvas>
<mx:Canvas label="3" width="100%" height="100%">
<mx:Label text="Accordion container panel 1"/>
</mx:Canvas>
<mx:Canvas label="4" width="100%" height="100%">
<mx:Label text="Accordion container panel 1"/>
</mx:Canvas>
</mx:Accordion>
как сделать так чтоб они сразу все отображались (прогружались), а не после первого обращения?