PDA

Просмотр полной версии : Как подружить Datagrid и внешний XML в AS3


zluk
04.05.2007, 11:18
делал как в хелпе:

1. Create a new Flash file (ActionScript 3.0) document.
2. In the Components panel, double-click the DataGrid component to add it to the Stage.
3. In the Property inspector, enter the instance name aDg.
4. Open the Actions panel, select Frame 1 in the main Timeline, and enter the following ActionScript code:

import fl.controls.dataGridClasses.DataGridColumn;
import fl.data.DataProvider;

var teamXML:XML = <team>
<player name="Player A" avg="0.293" />
<player name="Player B" avg="0.214" />
<player name="Player C" avg="0.317" />
</team>;

var nameCol:DataGridColumn = new DataGridColumn("name");
nameCol.headerText = "Name";
nameCol.width = 120;
var avgCol:DataGridColumn = new DataGridColumn("avg");
avgCol.headerText = "Average";
avgCol.width = 60;

var myDP:DataProvider = new DataProvider(teamXML);

aDg.columns = [nameCol, avgCol];
aDg.width = 200;
aDg.dataProvider = myDP;
aDg.rowCount = aDg.length;


Все работает.

а когда пробую подключить внешний XML перестает робить:

var loader:URLLoader;
// ...
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, xmlLoaded);

var request:URLRequest = new URLRequest("xmldata.xml");
loader.load(request);
//...
function xmlLoaded(event:Event):void {
var myXML:XML = new XML(loader.data);
//...
}

import fl.controls.dataGridClasses.DataGridColumn;
import fl.data.DataProvider;


var nameCol:DataGridColumn = new DataGridColumn("name");
nameCol.headerText = "Name";
nameCol.width = 120;
var avgCol:DataGridColumn = new DataGridColumn("avg");
avgCol.headerText = "Average";
avgCol.width = 60;

var myDP:DataProvider = new DataProvider(myXML);

aDg.columns = [nameCol, avgCol];
aDg.width = 200;
aDg.dataProvider = myDP;
aDg.rowCount = aDg.length;


пробовал разными способами, никак не получается...
подскажите плиз
собственно Adobe Flash CS3, ActionScript 3.0

motor4ik
04.05.2007, 11:49
у вас выполняется var myDP:DataProvider = new DataProvider(myXML); раньше чем var myXML:XML = new XML(loader.data); делайте выводы

zluk
04.05.2007, 11:50
спасибо, пошел думать

zluk
04.05.2007, 12:01
вроде поправил, вылезли другие ошибки...

motor4ik
04.05.2007, 12:15
ну так это же хорошо ) знаете в чем проблема, хуже когда они не вылазят и не знаешь в чем проблема

zluk
04.05.2007, 12:21
пошел эксперементировать

zluk
04.05.2007, 12:37
Сделал так:


import fl.controls.dataGridClasses.DataGridColumn;
import fl.data.DataProvider;


var myXML:XML;
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest("xmldata.xml");
loader.load(request);
loader.addEventListener(Event.COMPLETE, onComplete);

function onComplete(event:Event):void
{
var loader:URLLoader = event.target as URLLoader;
if (loader != null)
{
myXML = new XML(loader.data);
trace(myXML.toXMLString());


}
else
{
trace("loader is not a URLLoader!");
}
}


var nameCol:DataGridColumn = new DataGridColumn("name");
nameCol.headerText = "Name";
nameCol.width = 120;
var avgCol:DataGridColumn = new DataGridColumn("avg");
avgCol.headerText = "Average";
avgCol.width = 60;

var myDP:DataProvider = new DataProvider(myXML);

aDg.columns = [nameCol, avgCol];
aDg.width = 200;
aDg.dataProvider = myDP;
aDg.rowCount = aDg.length;



пишет ошибку:

TypeError: Error #1088: The markup in the document following the root element must be well-formed.
at test2_fla::MainTimeline/onComplete()
at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/flash.net:URLLoader::onComplete()



XML:

<?xml version="1.0"?>
<team>
<player name="Player A" avg="0.293" />
<player name="Player B" avg="0.214" />
<player name="Player C" avg="0.317" />
</team>

motor4ik
04.05.2007, 12:50
попробуйте сначала слушателя добавить а потом load сделать

zluk
04.05.2007, 12:51
что такое слушатель?

motor4ik
04.05.2007, 13:00
EventListener, но это я прогнал со сменой мест, не в этом дело

zluk
04.05.2007, 13:07
ковыряю дальше

motor4ik
04.05.2007, 13:56
всетаки думаю чето с xml не так, ищите в нем ошибку

zluk
04.05.2007, 13:56
Сломал себе мозг....
кто нибудь делал подобное?
поделитесь примерчиком плз.

всетаки думаю чето с xml не так, ищите в нем ошибку
попробую

в оутпут идет

<team>
<player name="zluk A" avg="0.293"/>
<player name="Player B" avg="0.214"/>
<player name="Player C" avg="0.317"/>
</team>

а таблица не рисуется

miramax
07.05.2007, 17:14
import fl.controls.dataGridClasses.DataGridColumn;
import fl.data.DataProvider;

var xmlPath:String = 'team.xml'
// грузим
var ldr:URLLoader = new URLLoader();
ldr.load(new URLRequest(xmlPath));
ldr.addEventListener('complete', loaded);

function loaded(e:Event):void
{
// кастинг в AS3 делается так
var l:URLLoader = URLLoader(e.currentTarget);

//загрузили проверили
trace(l.data);

setDataGrid(XML(l.data));
}

function setDataGrid(teamXML:XML):void
{
var nameCol:DataGridColumn = new DataGridColumn("name");
nameCol.headerText = "Name";
nameCol.width = 120;
var avgCol:DataGridColumn = new DataGridColumn("avg");
avgCol.headerText = "Average";
avgCol.width = 60;

var myDP:DataProvider = new DataProvider(teamXML);

aDg.columns = [nameCol, avgCol];
aDg.width = 200;
aDg.dataProvider = myDP;
aDg.rowCount = aDg.length;
}
Посмотри примеры в хелпе с классами Event и EventDispatcher .

zluk
07.05.2007, 17:23
Балшое спасибо, все заработало.
Пошел учить классы