无法在datagrid中访问arrayCollection的子节点

时间:2009-05-22 13:21:59

标签: flex actionscript datagrid

我有一个Flex3应用程序,HTTPService返回Atom提要。我从中捕获结果并将其存储在arrayCollection中,然后是我的Datagrid的提供者。 我从我的数组的“第一级”访问数据没有问题,但不能在它下面。 不太清楚,所以这里有一些代码:

我的XML [部分内容]:

<entry>
<title>Test 2</title>
<id>http://collaboration.*****.com/collaboration/messaging/feeds/****/todo//7D6637D3E86B3ED3C12575B***8479</id>
<link rel="alternate" href="notes:///C12575B4004***8/0/7D6637D3E86B3ED3C12575B6004E8479" type="application/vnd.lotus-notes"/>
<published>2009-05-14T16:17:37+02:00</published>
<updated>2009-05-14T16:17:56+02:00</updated>
<clb:todo>
<clb:uid>7D66***3ED3C12575B6004E8479</clb:uid>
<clb:due>2009-05-31T12:01:00+02:00</clb:due>
<clb:status>Not Started</clb:status>
</clb:todo>
</entry>

我的数据网格代码:

        <mx:AdvancedDataGrid y="10" id="notesGrid" width="90%" height="243" designViewDataType="flat" x="10" selectionMode="multipleRows" dataProvider="{notesArray}" >
            <mx:columns>
                <mx:AdvancedDataGridColumn 
                    headerText="TITRE" 
                    dataField="title" 
                    fontWeight="bold"
                 />
                <mx:AdvancedDataGridColumn headerText="STATUT" dataField="todo.status"/>
            </mx:columns>
        </mx:AdvancedDataGrid>

“标题”列正确显示数据,但状态列为空!当我在调试模式下启动我的应用程序时,我可以看到我的notesArray具有正确的格式,我可以访问todo - &gt;状态值为...

我已经坚持了几天,我很感激任何帮助! 谢谢和最好的问候!!

3 个答案:

答案 0 :(得分:0)

这可能与“status”节点使用与标题不同的名称空间“clb”这一事实有关。您可能需要指定命名空间才能访问它的数据。

从.NET WebService检索XML数据时,我必须做类似的事情。我花了几天时间搞清楚。

如果你的XML看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<atomFeed xmlns:clb="CLB.data">
    <entry>
    <title>Test 2</title>
    <id>http://collaboration.*****.com/collaboration/messaging/feeds/****/todo//7D6637D3E86B3ED3C12575B***8479</id>
    <link rel="alternate" href="notes:///C12575B4004***8/0/7D6637D3E86B3ED3C12575B6004E8479" type="application/vnd.lotus-notes"/>
    <published>2009-05-14T16:17:37+02:00</published>
    <updated>2009-05-14T16:17:56+02:00</updated>
    <clb:todo>
    <clb:uid>7D66***3ED3C12575B6004E8479</clb:uid>
    <clb:due>2009-05-31T12:01:00+02:00</clb:due>
    <clb:status>Not Started</clb:status>
    </clb:todo>
    </entry>
</atomFeed>

将此添加到处理HTTPService结果的ActionScript中:

private namespace clbNS = "CLB.data";

use namespace clbNS;

例如:

包 {     import mx.rpc.events.ResultEvent;

public class handleAtomFeed
{
    private namespace clbNS = "CLB.data";

    use namespace clbNS;

    private function resultHandler(event:ResultEvent):void
    {
        // pares the XML and build your ArrayCollection
    }
}

}

给它射击,它可能会起作用!!!

答案 1 :(得分:0)

我非常确定DataGridColumn / AdvancedDataGridColumn的dataField属性不会自动解析嵌套属性,即“todo.status”;您可能想尝试编写一个labelFunction,它将为您访问嵌套的XML元素。

答案 2 :(得分:0)

当涉及到这类问题时,我遵循的一般规则就是做这样的事情(只是为了确保你得到你正在寻找的一切):

import flash.utils.getQualifiedClassName;

// As a general rule, I don't find it the best idea to access an object in 
// an IList (ArrayCollection, XMLListCollection, et al ) by a dynamic property.
// Especially when they are coming from XML, the best way to access everything 
// is through getItemAt.
var len:int = todo.length;
for( var i:int = 0; i < len; i++ )
{
    var item:* = todo.getItemAt( i );
    trace( item, getQualifiedClassName( item ) );
}

在那之后,我的第一次尝试将取代它:

<mx:AdvancedDataGridColumn headerText="STATUT" dataField="todo.status"/>

用这个:

<mx:AdvancedDataGridColumn headerText="STATUT" dataField="{ todo.status }"/>

很多时候,Flex根本不能很好地使用嵌套属性,但是当你使用括号时,它会将在该位置找到的值作为更直接的引用。

我认为你最好在ArrayCollection上使用XMLListCollection。这样,您可以按名称调用子项,而不是依赖于IList中的正常索引。