Flex3 AdvancedDataGrid:如何在现有列的基础上添加新列?

Posted

技术标签:

【中文标题】Flex3 AdvancedDataGrid:如何在现有列的基础上添加新列?【英文标题】:Flex3 AdvancedDataGrid : how to add a new column based on existing one? 【发布时间】:2011-07-30 12:41:09 【问题描述】:

我在 flex3 (Flex 3) 中有一个 AdvancedDataGrid,有 4 列:

id : 整数 类别:字符串 名称:字符串 isPreferred : 布尔值

我想添加第五列

最喜欢的:图片

favourite 的值将基于 isPreferred 的值:如果为 true,则 favorite 将是一个 read-heart-icon,如果为 false,一个 gray-heart-icon。 感谢您的帮助。

下面是我的代码:

mxml 内容

导入 mx.collections.ArrayCollection; 进口 com.test.Purchase; [嵌入(source=".​​.\assets\coeur_rouge.png")] 公共静态常量 ICON_FAVORITE:Class; [嵌入(source=".​​.\assets\coeur_gris.png")] 公共静态常量 ICON_NEUTRAL:Class; [可绑定] public var myAC:ArrayCollection = new ArrayCollection(); 公共函数 init() :void var aPurchase:Purchase=new Purchase(); var anotherPurchase:Purchase= new Purchase(); aPurchase.id=120; aPurchase.category="category1"; aPurchase.name="优势 2"; aPurchase.isPreferred=true; myAC.addItem(aPurchase); anotherPurchase.id=220; anotherPurchase.category="category2"; anotherPurchase.name="Nintendo DS"; anotherPurchase.isPreferred=false; myAC.addItem(anotherPurchase); ]]>脚本>应用>

动作脚本中的数据对象 公开课购买 公共函数购买()

私有变量 _id:int = -1; 私有变量 _category:String = null; 私有 var _productName:String = null; 私有变量 _preferred:Boolean=false;

公共函数获取 id():int 返回_id;

公共函数集 id(pId:int):void _id = pId;

公共函数获取类别():字符串 返回_类别;

公共函数集类别(pCategory:String):void _category = pCategory;

if ((_category == null) || (_category == ""))                
    _category = "Default Category";

公共函数获取名称():字符串 返回_产品名称;

公共函数集名称(pName:String):void _productName = pName;

if ((_productName == null) || (_productName == "")) 
    _productName = "default product name";
    category = _productName;
 

公共函数获取 isPreferred() : Boolean 返回_首选;

公共函数集 isPreferred(pPreferred:Boolean) :void _preferred=pPreferred;

【问题讨论】:

【参考方案1】:

为此,您需要itemRenderer。这样的事情应该可以工作:

<mx:AdvancedDataGridColumn headerText="favorite">
    <mx:itemRenderer>
        <mx:Component>
            <mx:Image source="data.isPreferred ? ICON_FAVORITE : ICON_NEUTRAL">
                <mx:Script>
                    <![CDATA[
                        [Embed(source="..\assets\coeur_rouge.png")]
                        public static const ICON_FAVORITE:Class;

                        [Embed(source="..\assets\coeur_gris.png")]
                        public static const ICON_NEUTRAL:Class;
                    ]]>
                </mx:Script>
            </mx:Image>
        </mx:Component>
    </mx:itemRenderer>
</mx:AdvancedDataGridColumn>

请记住,这段代码不可重用。如果您需要使用大量显示图像的列,我建议您实现自定义ImageColumn,它扩展mx:AdvancedDataGridColumn,具有某种imageFunction 作为属性并使用自定义itemRenderer,它将使用列的imageFunction显示适当的图像。

【讨论】:

格哈德你说得对:我想说明我的问题。您能否建议一个更简单的替代方案(比扩展 AdvancedDataGridColumn),因为我是 flex3 的新手。你会怎么做? simple 解决方案是我在上面的代码 sn-p 中发布的解决方案。它使用Image 作为itemRenderer,其中source 根据data.isPreferred 的值而变化。我还概述了如何实现ImageColumn。我会为该列实现一个imageFunction(比如它的labelFunction)。自定义渲染器可以通过其listData 访问该列。自己试试。当您了解列和渲染器的工作原理时,这并不复杂。如果您想创建这样的ImageColumn 并有具体问题,请发布另一个问题。 我测试了建议的解决方案,但这不是编译 <mx:AdvancedDataGridColumn headerText="favorite"> <mx:itemRenderer> <mx:组件> <mx:Image source="data.isPreferred ? ICON_FAVORITE : ICON_NEUTRAL"/> </mx:组件> </mx:itemRenderer> &ltl;/mx:AdvancedDataGridColumn> -1120:访问未定义的属性 ICON_NEUTRAL。 -1120:访问未定义的属性 ICON_FAVORITE。 Gerhard,除了这个可见性问题(看起来变量在 mx:itemrenderer 和 mx:component 中不可见)一切正常。我只是把字符串常量。感谢您的帮助。

以上是关于Flex3 AdvancedDataGrid:如何在现有列的基础上添加新列?的主要内容,如果未能解决你的问题,请参考以下文章

具有大量 UI 对象的 Flex 应用程序 == 慢?

从 textarea flex3 中保存空格和换行符

在 flex3 中调整 TabNavigator 中的内容大小

如何以正确的方式在 Actionscript 3 / Flex 3 中嵌入图像?

Flex3 Datagrid:标志上的自定义行

打印从 flex3 的 tilelist 中选择的多个项目