【问题标题】:Looking for an example of a dynamically created Spark.DataGrid in Flash Builder在 Flash Builder 中寻找动态创建的 Spark.DataGrid 的示例
【发布时间】:2016-09-06 07:09:03
【问题描述】:

我正在尝试在 Flash Builder AS3 代码中(不在标记中)动态创建 DataGrid,但无法获取任何要显示的数据。 以下是我创建网格的方式:

for (var i:int = 0; i < numOfWinners; i++){
            if (list[i].Name[0])                        
                dataP.addItem({profilePic: list[i].ProfilePicUrl.toString(), name: list[i].Name.toString(), prizePic: list[i].ItemImageUrl.toString()});
            else
                dataP.addItem({profilePic: list[i].ProfilePicUrl.toString(), name: list[i].UserName.toString(), prizePic: list[i].ItemImageUrl.toString()});
        }

        // Create a new DataGridColumn object.
        var playerCol:GridColumn = new GridColumn("profilePic");
        playerCol.width = 110;

        var nameCol:GridColumn = new GridColumn("name");
        nameCol.width = 100;             
        nameCol.itemRendererFunction = MyCustomItemRendererFunction;            
        var prizePicCol:GridColumn = new GridColumn("prizePic");
        prizePicCol.width = 160;

        cols.addItem(nameCol);
        cols.addItem(playerCol);
        cols.addItem(prizePicCol);
        grid.columns = cols;            
        grid.dataProvider = dataP;



        private function MyCustomItemRendererFunction(item:Object, column:GridColumn):ClassFactory 
    {           
        // Create a Class Factory variable
        var myRendererObject:ClassFactory;

        // This is the "default" color is nothing else happens
        // I'm passing it a pointer to "MyItemRenderer"

        myRendererObject = new ClassFactory(ProfilePicRenderer);

        if (column.dataField == "profilePic")
        {
            myRendererObject.properties = { source: item.profilePic};
        }

        return myRendererObject;

    }

我似乎找到的所有示例都在 Flex 4 (MX + Spark) 项目的标记中。

我在这里做错了什么?

谢谢!

【问题讨论】:

  • 您能否具体说明“无法显示任何数据”是什么意思?网格和列是否可见?您是否看到您的 itemrenderers 但它们是空的?如果是这样,请发布您的 ProfilePicRenderer 的代码。我已经可以说的是,您应该只覆盖项目渲染器中的 set data() 方法并在那里获取配置文件图片,而不是通过属性进行设置 - 这就是 set data 的用途:)
  • 我什么也没看到。只是一片空白。 itemRendererFunction 永远不会被调用。我有一个断点,但它没有被击中。
  • 因为我在你的代码中没有看到它,所以我不得不问 - 你确实使用 addChild(grid) 将数据网格添加到舞台,对吧?而且您没有在某些时候将其设置为 visible = false 吗?
  • 正确。没有 Flex MX/Spark 的纯 AS 项目似乎不支持此功能
  • 但通常有一种方法可以在没有 Flex 的情况下使用数据网格。你见过这个吗? help.adobe.com/en_US/ActionScript/3.0_UsingComponentsAS3/…

标签: actionscript-3 apache-flex datagrid flash-builder4.5


【解决方案1】:

您可以添加 ProfilePicRenderer 如下:

var playerCol:GridColumn = new GridColumn("Profile Picture");
var profilePicItemRenderer:ClassFactory = new ClassFactory(ProfilePicRenderer);
playerCol.itemRenderer =  profilePicItemRenderer;
playerCol.width = 110;

ProfilePicRenderer.mxml 如下所示:

<?xml version="1.0"?>
<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
                xmlns:s="library://ns.adobe.com/flex/spark">
<fx:Script><![CDATA[
    override public function set data(value:Object):void {
        if (super.data != value) {
            super.data = value;
        }
        image.source = "./images/" + data.profilePic;
    }
    ]]></fx:Script>
<s:Image id="image" width="50" height="50"/>

</s:GridItemRenderer>

同样添加PrizePicRenderer如下:

var prizePicCol:GridColumn = new GridColumn("Prize Picture");
var prizePicRenderer:ClassFactory = new ClassFactory(PrizePicRenderer);
prizePicCol.itemRenderer =  prizePicRenderer;
prizePicCol.width = 160;

PrizePicRenderer.mxml 如下所示:

<?xml version="1.0"?>
<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
                xmlns:s="library://ns.adobe.com/flex/spark">
<fx:Script><![CDATA[
    override public function set data(value:Object):void {
        if (super.data != value) {
            super.data = value;
        }
        image.source = "./images/" + data.prizePic;
    }
    ]]></fx:Script>
<s:Image id="image" width="50" height="50"/>
</s:GridItemRenderer>

这里是使用itemRenderer动态添加DataGrid的示例应用程序:

<?xml version="1.0"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
           xmlns:s="library://ns.adobe.com/flex/spark">
<fx:Script><![CDATA[
    import mx.collections.ArrayCollection;
    import mx.collections.ArrayList;

    import spark.components.DataGrid;
    import spark.components.gridClasses.GridColumn;

    private var dataP:ArrayCollection = new ArrayCollection([
        {"name": "Lebron James", "profilePic": "p1.jpeg", "prizePic": "t1.jpg"},
        {"name": "Stephen Curry", "profilePic": "p2.jpeg", "prizePic": "t2.jpg"},
        {"name": "Kevin Durant", "profilePic": "p3.jpeg", "prizePic": "t3.jpg"},]) ;

    private function addDataGrid():void
    {
        var grid:DataGrid = new DataGrid();

        var nameCol:GridColumn = new GridColumn("Name");
        nameCol.width = 100;
        nameCol.dataField = "name";

        var playerCol:GridColumn = new GridColumn("Profile Picture");
        var profilePicItemRenderer:ClassFactory = new ClassFactory(ProfilePicRenderer);
        playerCol.itemRenderer =  profilePicItemRenderer;
        playerCol.width = 110;

        var prizePicCol:GridColumn = new GridColumn("Prize Picture");
        var prizePicRenderer:ClassFactory = new ClassFactory(PrizePicRenderer);
        prizePicCol.itemRenderer =  prizePicRenderer;
        prizePicCol.width = 160;

        var cols:ArrayList = new ArrayList();
        cols.addItem(nameCol);
        cols.addItem(playerCol);
        cols.addItem(prizePicCol);
        grid.columns = cols;

        grid.dataProvider = dataP;
        vGroup.addElement(grid);
    }
    ]]></fx:Script>
<s:VGroup id="vGroup" paddingTop="10" paddingLeft="10"
                    paddingBottom="10" paddingRight="10">
    <s:Button label="Click to build DataGrid dynamically." click="addDataGrid()"/>
</s:VGroup>
</s:Application> 

我假设您的项目中有图片文件并且dataProvider 定义明确。希望这会有所帮助。

这里是 ProfilePicRendererActionScript 版本,如果您不想要 MXML,它是 ProfilePicRendererAS.as

package {
import spark.components.Image;
import spark.components.gridClasses.GridItemRenderer;

public class ProfilePicRendererAS extends GridItemRenderer {
private var image:Image;
public function ProfilePicRendererAS() {
    super();
    image = new Image();
    image.width = 50;
    image.height = 50;
    this.addElement(image);
}
override public function set data(value:Object):void {
    if (super.data != value) {
        super.data = value;
    }
    image.source = "./images/" + data.profilePic;
}
}
}

【讨论】:

  • 谢谢!我试过了,我从某个地方得到了一个空引用。它被抛出 vGroup.addElement。 vGroup 不为空。这是堆栈的顶部:TypeError:错误#1009:无法访问空对象引用的属性或方法。在 mx.styles::StyleManager$/getStyleManager()[E:\dev\4.y\frameworks\projects\framework\src\mx\styles\StyleManager.as:139]
  • 我还应该提到我在 AS3 中做整个应用程序。我们没有使用 MXML。
  • 我提供了 AS3 版本的 ProfilePicRenderer.mxml。同样你可以编写 AS3 版本的 PrizePicRenderer.mxml。
  • 知道异常是什么吗?我需要创建一个样式管理器还是什么?
  • 它对我来说工作正常,没有错误。我使用的是 Flex SDK 4.6 版本。您使用的是哪个版本的 SDK?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多