Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Динамический Accordion и DataGrid (http://www.flasher.ru/forum/showthread.php?t=123672)

Anaza 07.04.2009 19:08

Динамический Accordion и DataGrid
 
Идея такая. Считывается с БД сколько существует групп и делается чтолько же вкладок accordion, а каждая вкладка заполняется dataGrid.

Проблема не могу корректно передать в dataGrid itemRender. Как это сделать.
Код AS3:

<?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,

Код AS3:

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

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

[IMG]http://s58.***********/i159/0904/d7/4bc90f6cf1cbt.jpg[/IMG]

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

[IMG]http://s41.***********/i092/0904/2d/f64e3e70a7cbt.jpg[/IMG]

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

Tim SharK 08.04.2009 11:53

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

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


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

Anaza 08.04.2009 12:24

Вид не устраивает тем что он не удобен для просмотра пользователем.

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

Код AS3:

        <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 я правильно поняла?

Код AS3:

<?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

Цитата:

Сообщение от GBee (Сообщение 811758)
Вроде все ок, только картинку через одно место грузите, просто в сурс путь запихнуть не судьба?

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

Цитата:

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

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

GBee 08.04.2009 13:57

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

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

Tim SharK 08.04.2009 15:56

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

Anaza 08.04.2009 18:18

[IMG]http://i001.***********/0904/8d/628b2635d06bt.jpg[/IMG]
Как можно заметить там есть пустая панелька от dataGrid с названием.

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

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

Цитата:

Сообщение от Tim SharK (Сообщение 811913)
а попробуй в коде 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 из них выбрана по умолчанию. Еслм переключится на вторую то при выезде её содержимое не показывается а показывается только после того как она полностью выехала. самое интересное сто если эту плашку закрыть а потом открыть снова то всё плавно выезжает как и надо. такое чувство что изначально до первого обращения они не вставлены в сцену.
код простейший.
Код AS3:

<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>

как сделать так чтоб они сразу все отображались (прогружались), а не после первого обращения?


Часовой пояс GMT +4, время: 22:03.

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