【问题标题】:Flex DataGrid - how to pass the cell's displayed value to the sortCompareFunction?Flex DataGrid - 如何将单元格的显示值传递给 sortCompareFunction?
【发布时间】:2013-01-30 15:56:48
【问题描述】:

我有一个 dataGrid,我在其中的列上使用 labelFunction。这会将 dataField 更改为不同的值。

我在同一列上有一个 sortCompareFunction。但是, sortCompareFunction 只使用底层数据项值。

我知道我可以在进行比较之前从 sortCompareFunction 中调用 labelFunction 来更改值,但我想做的是:将显示的值从列传递给 sortCompareFunction。这可能吗。

下面的一些示例代码表示问题(如果您复制并粘贴到新的 Flex 3 应用程序,则有效)

在图像中,值“AAAA”后面的数据是“The Wall”,所以它在排序时出现在中心,我想访问“AAAA”值:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
                initialize="init()">
    <mx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.controls.dataGridClasses.DataGridColumn;
            import mx.utils.ObjectUtil;

            [Bindable]
            private var albums:ArrayCollection;

            private function init():void
            {
                var album:Object;
                albums = new ArrayCollection();

                album = new Object();
                album.name = "Who's Next";
                album.artist = "The Who";
                album.date = "Jul 31 1971";
                albums.addItem(album);

                album = new Object();
                album.name = "Exile on Main St.";
                album.artist = "The Rolling Stones";
                album.date = "May 12 1972";
                albums.addItem(album);

                album = new Object();
                album.name = "The Wall";
                album.artist = "Pink Floyd";
                album.date = "Dec 8 1979";
                albums.addItem(album);
            }

            private function nameLabelFunction(inData:Object, inColumn:DataGridColumn):String
            {
                if(inData.name == "The Wall")
                {
                    return "AAAA"
                }
                else
                    return inData.name;
            }

            private function nameSortCompare(obj1:Object, obj2:Object):int
            {
                return ObjectUtil.stringCompare(obj1["name"], obj2["name"], true);
            }

        ]]>
    </mx:Script>
    <mx:DataGrid width="400" height="600" dataProvider="{albums}">
        <mx:columns>
            <mx:DataGridColumn dataField="name" headerText="Name" width="125" 
                               labelFunction="nameLabelFunction"
                               sortCompareFunction="nameSortCompare"/>

            <mx:DataGridColumn dataField="artist" headerText="Artist" width="125" />

            <mx:DataGridColumn dataField="date" headerText="Date" width="100" />
        </mx:columns>
    </mx:DataGrid>
</mx:Application>

【问题讨论】:

  • 您希望实现什么样的实际场景?根据您的比较函数中的字段“名称”比较两个对象,并且比较不依赖于实际标签。你能更具体地解释一下你的目标吗?
  • 假设nameLabelFunction()中生成标签的过程非常繁重,我不想在对海量数据网格进行排序时重复这个过程数千次。我不知道如何访问实际的“标签”
  • 一般你不能。 Flex 不会存储所有 dataGrid 数据的标签值。正如您所说,数据可以是数千个项目,但 DataGrid 只显示很少的项目。想想看,很明显你必须找到另一种方法。如果您需要进一步的帮助,请发表评论。
  • 嘿,大卫,是的,没有简单的解决方法。 Anton 下面的 cmets 很有帮助,尤其是在计算后将标签值添加到数据对象,然后使用它。这是一个不错的选择

标签: actionscript-3 apache-flex flex4 flex3


【解决方案1】:

我们可以使用一个小技巧吗?

        private function nameLabelFunction(inData:Object, inColumn:DataGridColumn):String
        {
            if(inData.name == "The Wall")
            {
                inData.realLabel = 'AAAA';

                return "AAAA"
            }
            else
            {
                inData.realLabel = inData.name;

                return inData.name;
            }
        }

        private function nameSortCompare(obj1:Object, obj2:Object):int
        {
            return ObjectUtil.stringCompare(obj1["realLabel"], obj2["realLabel"], true);
        }

//编辑

使用 labelFunction 本身的另一种方法

您可以使用函数来评估正在比较的值

假设f是Function类的对象,那么

f.call(dg.columns[0], obj1, dg.columns[0])

为您提供数据网格字段的实际标签。

//this function should not be changed
        private function nameLabelFunction(inData:Object, inColumn:DataGridColumn):String
        {
            if(inData.name == "The Wall")
                return "AAAA"
            else
                return inData.name;
        }

//the actual comparison looks now like this:
        private function nameSortCompare(obj1:Object, obj2:Object):int
        {
            var f:Function = (dg.columns[0] as DataGridColumn).labelFunction;

            return ObjectUtil.stringCompare(f.call(dg.columns[0], obj1, dg.columns[0]), f.call(dg.columns[0], obj2, dg.columns[0]), true);
        }

【讨论】:

  • 啊,好主意,谢谢。但是,这不是一个真正的选择。至少现在对其他人来说我在寻找什么更清楚了......可惜 DataGrid 的单元格标签不是更容易访问
  • 你能解释一下你在找什么吗,我能得到更好的解决方案吗?最好的选择是什么?
  • 基本从sortCompareFunction访问DataGrids单元格的标签
  • 嗨,布莱恩,又是我。看看我编辑的帖子,也许这个想法可以帮助你。
  • 嘿,谢谢,这很好,但仍然在每次比较调用时调用标签函数......可能有数千个,但感谢这篇文章。它比我拥有的干净得多
猜你喜欢
  • 1970-01-01
  • 2020-11-14
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
  • 2020-12-28
相关资源
最近更新 更多