Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.08.2009, 18:39
nOobCrafter вне форума Посмотреть профиль Отправить личное сообщение для nOobCrafter Найти все сообщения от nOobCrafter
  № 1  
Ответить с цитированием
nOobCrafter

Регистрация: Nov 2008
Сообщений: 894
Записей в блоге: 1
По умолчанию Проблема с компонентом 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]);							// на выходе охота получить что то типа этого.
я в тупике. Кто нибудь может посоветовать как хоть примерно это решить?
З.Ы. за основу взял этот пример


Последний раз редактировалось nOobCrafter; 28.08.2009 в 11:39.
Старый 31.08.2009, 15:24
KPOT вне форума Посмотреть профиль Отправить личное сообщение для KPOT Найти все сообщения от KPOT
  № 2  
Ответить с цитированием
KPOT
[+1.3 31.07.07]
 
Аватар для KPOT

Регистрация: Jul 2007
Сообщений: 64
А ты можешь в дебаге посмотреть чему равен newArr
Вот в этом моменте:

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

Старый 31.08.2009, 16:26
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 3  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
А вы еще больша анонимных функций туда напихайте... и развлекайтесь с дебаггером.
__________________
Hell is the possibility of sanity

Старый 01.09.2009, 11:47
nOobCrafter вне форума Посмотреть профиль Отправить личное сообщение для nOobCrafter Найти все сообщения от nOobCrafter
  № 4  
Ответить с цитированием
nOobCrafter

Регистрация: Nov 2008
Сообщений: 894
Записей в блоге: 1
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('========================');
			}
Может кому будет полезно. Я так понимаю это все делалось по аналогии с похожими библиотеками в ява-скрипте?

Старый 01.09.2009, 23:33
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 5  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
>> взяты из примера, что на главной странице этой библиотеки
Где он? О какой библиотеке речь? Неужели на этом форуме? Если да, ткните пальцем, надо срочно ликвидировать
__________________
Hell is the possibility of sanity

Старый 03.09.2009, 12:23
nOobCrafter вне форума Посмотреть профиль Отправить личное сообщение для nOobCrafter Найти все сообщения от nOobCrafter
  № 6  
Ответить с цитированием
nOobCrafter

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

Старый 03.09.2009, 12:37
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 7  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
А ну если там такие чудо-примеры на главной странице, я себе представляю, как оно внутри работает...
А по поводу вашей ситуации с массивами... Я все равно не совсем уверен, что понимаю, что именно нужно было сделать, но если код в примере выше точно отражает ситуацию, то что-то такое:
Код 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
__________________
Hell is the possibility of sanity

Старый 04.09.2009, 13:31
nOobCrafter вне форума Посмотреть профиль Отправить личное сообщение для nOobCrafter Найти все сообщения от nOobCrafter
  № 8  
Ответить с цитированием
nOobCrafter

Регистрация: Nov 2008
Сообщений: 894
Записей в блоге: 1
когда я писал первый пост, я плохо представлял что именно от меня надо, теперь я более менее понял, структура примено такова
Код 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, время: 03:29.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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