Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Проблема с компонентом Tree и ArrayCollection( (http://www.flasher.ru/forum/showthread.php?t=129247)

nOobCrafter 27.08.2009 18:39

Проблема с компонентом Tree и ArrayCollection(
 
День добрый, пытаюсь вытащить из БД определенные столбцы (что вообщем то получается, использую недавноупомянутый драйвер asSQL) и сформировать из них новый ArrayCollection с целью скормить в роли дата провайдера для компонента Tree. С этим есть проблемы(( Переделываю из примера с датагридом. Пробую сделать так:
Код AS3:

                                  // выбираем нужныенам столбцы 
var token:MySqlToken = st.executeQuery("SELECT userf, useri, usero FROM usrtab");
 
                                token.addEventListener(MySqlEvent.COLUMNDATA, function(e:MySqlEvent):void {
                                    tempArr = new ArrayCollection()// временная коллекция куда все складываем
 
                            // grid.columns = ResultsUtil.getDataGridColumns( e.resultSet );
                            // grid.dataProvider = users;
                                    });
 
                            //listen for new rows
                            token.addEventListener(MySqlEvent.ROWDATA, function(e:MySqlEvent):void {
                                addNewRows(e.resultSet);
                            });                           
 
                            //add a responder
                            token.addResponder(new AsyncResponder(
                                function(data:Object, token:Object):void {
                                        //call add new rows again to ensure we have all the rows
                                        addNewRows(ResultSet(data));
                                },
                                function(info:Object, token:Object):void {
                                        Alert.show("Error: " + info);
                                },
                                token
                            ));
                        }
 
                        private function addNewRows(rs:ResultSet):void {
                            //get our data provider
                            var dp:ArrayCollection = tempArr;//.dataProvider as ArrayCollection;
 
                            var newRows:ArrayCollection = rs.getRows(false, dp.length, (rs.size()-dp.length));
                                    dp.source = dp.source.concat( newRows.source );
                                  //        dp.refresh();       
 
                            if(++ll == (count))                        // определяем что обошли все записи
                            {
                                    userArr = new ArrayCollection();
                                    var total1:int = newRows.length;                                                // определяем длинну подмассива
                                    var total2:int = dp.length;                                                        // определяем длинну главной коллекции
                                    for(var i:int = 0; i < total1; i++)
                        {
                                for(var j:int = 0; j < total2; j++)
                                {
                                        newArr.getItemAt(i) += arrTotal.getItemAt(j).getItemAt(i) + ' ';        // получаем елемент1 + елемент2 + елемент3
                                }
                        }
                        tree.dataProvider = newArr;                        // в конце назначаем, как дата провайдер
                            }                 
                        }
                ]]>
        </mx:Script>
        <mx:Tree id="tree" left="10" right="10" top="10" bottom="10" />

Как это правильно реализовать? на ас3 это выглядит примерно так:
Код AS3:

var arr1:Array = [];
var arr2:Array = [];
var arr3:Array = [];
var i:int = 0;
var j:int = 0;
 
for(i = 0; i < 500; i++)                                        // заполняем наши массивы
{
        arr1[i] = arr2[i] = arr3[i] = i;
}
var arrTotal:Array = [arr1, arr2, arr3];        // имитируем нашу ситуацию, в одной коллекции, есть несколько других коллекций
var newArr:Array = [];                                                // делаем то что нам надо
 
for(i = 0; i < arrTotal[0].length; i++)
{
        newArr[i] = '';                                                        // делаем пустой елемент,
        for(j = 0; j < arrTotal.length; j++)
        {
                newArr[i] += arrTotal[j][i] + ' ';        // получаем елемент1 + елемент2 + елемент3
        }
}
trace(newArr[100]);                                                        // на выходе охота получить что то типа этого.

я в тупике. Кто нибудь может посоветовать как хоть примерно это решить?
З.Ы. за основу взял этот пример

KPOT 31.08.2009 15:24

А ты можешь в дебаге посмотреть чему равен newArr
Вот в этом моменте:

Код:

tree.dataProvider = newArr;
Скопировать всё, и выложить сюда, всю структуру.
Тогда сразу будет видно проблему...

wvxvw 31.08.2009 16:26

А вы еще больша анонимных функций туда напихайте... и развлекайтесь с дебаггером.

nOobCrafter 01.09.2009 11:47

wvxvw спасибо на добром слове, но вообщем то все эти аномалии взяты из примера, что на главной странице этой библиотеки( К тому же проблема укреплялась моим абсолютным непониманием работы ArrayCollection. Теперь проблема решена вот таким образом, может немного кривовато зато работает.)
Код AS3:

private function addNewRows(rs:ResultSet):void                         // добавляем пользователей
            {
            var tempArr:Array = [''];                                                        // делаем пустой временный массив
            var dp:ArrayCollection = grid.dataProvider as ArrayCollection;
            var dbSource:Array = dp.source[0].children as Array;// определяем источник данных
 
            var newRows:ArrayCollection = rs.getRows(false, dbSource.length, (rs.size() - dbSource.length)); // определяем ряды
 
        len = newRows.source.length;                                                // опеределяем кол-во рядов
        var propLen:int = usersNameColumn.length;
 
                for(i = 0; i < len; i++)
                {
                var str:String = String(++counter) + ' ';//'';  // для тестов) + пустая строка куда заносим результат
                    for(var j:int = 0; j < propLen; j++)                        // смысл в том тчо пробегаемся по ряду, собираем все что там записано и ложим в строку
                    {
                            var propName:String = usersNameColumn[j];
                            var prop:String = newRows.source[i][propName];
                                                if(prop != null) { str += prop + ' '; }                // cтрока должна быть не пустой
                    }
                          var tempObj:Object = {label: str, children: []};// делаем обьект и в его св-ва пишем имя подьзователя
                          tempArr[i] = tempObj;                                                        // пихаем в массив
                          //trace(str + ' -- ' + i);
                }
 
                trace(tempArr.length);
                var newArrCol:ArrayCollection = new ArrayCollection(tempArr);
                                          // делаем такой финт ушами, зачем непонял, но иначе будет небольшой беспорядок((
          dp.source[0].children = newArrCol.source;//dp.source.concat(newArrCol.source);
          trace('========================');
                        }

Может кому будет полезно. Я так понимаю это все делалось по аналогии с похожими библиотеками в ява-скрипте?

wvxvw 01.09.2009 23:33

>> взяты из примера, что на главной странице этой библиотеки
Где он? О какой библиотеке речь? Неужели на этом форуме? :) Если да, ткните пальцем, надо срочно ликвидировать :)

nOobCrafter 03.09.2009 12:23

да нет, не на этом, в первом посте была ссылка на пример http://code.google.com/p/assql/wiki/...eaming_Results . Как мне сказали еще можно сделать через labelFunction, но она запускается каждый раз при перерисовке дерева, и если элентом будет несколько тысяч то возможны тормоза, поэтому решил 1 раз нормально создать дата провайдер и не париться. В коде выше я просто из того тчо мне приходит соираю то что мне надо. Громоздко конечно, но мне кажеться все же будет практичнее нежеле каждый раз дергать ту же labelFunction. Если есть еще какие то варианты о которых я не знаю то с радостью выслушаю.

wvxvw 03.09.2009 12:37

А ну если там такие чудо-примеры на главной странице, я себе представляю, как оно внутри работает... :)
А по поводу вашей ситуации с массивами... Я все равно не совсем уверен, что понимаю, что именно нужно было сделать, но если код в примере выше точно отражает ситуацию, то что-то такое:
Код AS3:

var a:Array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
var b:Array = a[0].concat(a[1], a[2]);
trace(b.length, b.toString()); //9 1,2,3,4,5,6,7,8,9


nOobCrafter 04.09.2009 13:31

когда я писал первый пост, я плохо представлял что именно от меня надо, теперь я более менее понял, структура примено такова
Код AS1/AS2:

// то что у нас есть на входе
var source        : Array = [{property_1: 'item1.1' property_2: 'item1.2' property_3: 'item1.3'},
                                        {property_1: 'item2.1' property_2: 'item2.2' property_3: 'item2.3'},
                                        {property_1: 'item3.1' property_2: 'item3.2' property_3: 'item3.3'},
                                        {property_1: 'item4.1' property_2: 'item4.2' property_3: 'item4.3'},
                                                                ... несколько тысяч таких обектов...
                                        {property_1: 'itemN.1' property_2: 'itemN.2' property_3: 'itemN.3'}];
 
// то что я формирую на выходе и отдаю в качестве дата провайдера компоненту - дерево
var requisiteArray:Array = [{property: 'item1.1 item1.2 item1.3'},
                                                {property: 'item2.1 item2.2 item2.3'},
                                                {property: 'item3.1 item3.2 item3.3'},
                                                {property: 'item4.1 item4.2 item4.3'},
                                                ... несколько тысяч таких обектов...
                                                {property: 'itemN.1 itemN.2 itemN.3'}];



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

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