【问题标题】:Flex AdvancedDataGrid - setting the correct sort function at runtimeFlex AdvancedDataGrid - 在运行时设置正确的排序函数
【发布时间】:2009-08-27 19:15:55
【问题描述】:

使用 Flex 3.2,我有一个扩展 TitleWindow 的对象。在这个 TitleWindow 中,我有一个 AdvancedDataGrid。

在创建这个对象时,我传递给它 2 个列表,一个包含要显示的数据,另一个传递一个列定义数组。这使我能够在运行时创建正确的列并为每列定义正确的显示属性(例如,布尔值将显示为复选框,日期以特定格式格式化(来自各种 STRING 可能出现空值的格式)

问题在于,基于字符串的默认排序在 100% 的情况下无法正常工作,即使格式是一种可以很好排序的格式,当涉及空值时它也会失败。

使用 sortCompareFunction 可以轻松解决上述问题,但事实上,当您设置列的 sortCompareFunction 时,似乎需要您将列名硬编码到函数中。

有什么办法可以解决最后一个问题吗?

这里是我用来创建列的函数供参考:

    private function setupGrid():void
    {

        var localcols:Array = new Array();
        datagrid1.columns = new Array();


        var gcol:AdvancedDataGridColumn = new AdvancedDataGridColumn();
            gcol.headerText = "Group";
            gcol.dataField="GroupLabel";                
            localcols.push(gcol);

        for each (var s:Object in DGColumns)
        {               
            var col:AdvancedDataGridColumn = new AdvancedDataGridColumn();
            col.headerText = s.Header;
            col.dataField=s.Column;
            col.headerWordWrap = true;
            //col.sortable = false;             

            try
            {
                switch (s.type)
                {
                    case "boolean":
                        col.labelFunction = boolCellLabel;                           
                        break;
                    case "date":
                        col.labelFunction = dateCellLabel;
                        col.sortCompareFunction = dateCompare; // doesn't work, as the function requires the column name coded into it
                        // inline does not work because s.Column is still set to the last column in the grid at sort time 
                        col.sortCompareFunction = function (obj1, obj2):int
                            {
                                var l:XML = obj1 as XML;
                                var r:XML = obj2 as XML;

                                var left:Date = new Date( l.elements(s.Column).valueOf() );
                                var right:Date = new Date( r.elements(s.Column).valueOf() );


                                if (left == null && right == null) return 0;
                                else if (left == null) return -1
                                else if (right == null) return 1 
                                else if (left < right) return -1;
                                else if (left > right) return 1;
                                else return 0;
                        ;
                        break;
                    case "string": // use defaults
                    default:
                        break;
                }
            }
            catch (ex:Object) 
            {}              
            localcols.push(col);                                
        }
        datagrid1.columns = localcols;      
    }

对于列定义:

var DGColumns:Array = [{Header:"Lorem ipsum", Column: "lorem", type:"string"},                      
{Header:"dolor", Column: "dolor" , type:"string"},
{Header:"sit amet", Column: "sitAmet", type:"string"},
{Header:"consectetur", Column: "consecteturDate", type:"date"},
{Header:"adipiscing", Column: "adipiscingDate", type:"date"},
{Header:"elit", Column: "isElit" , type:"boolean"}
]

【问题讨论】:

    标签: apache-flex flex3


    【解决方案1】:

    找到了答案。这是一个多部分的解决方案。
    第 1 部分:按照我第一次尝试设置比较功能:

    col.sortCompareFunction = dateCompare;
    


    第 2 部分:向 AdvancedDataGrid 添加 headerRelease 事件处理程序

    <mx:AdvancedDataGrid -otherAttributes- headerRelease="HeaderClick(event)"   >
    


    第 3 部分:定义事件处理程序和全局变量以记住列

    private var clickedCol:AdvancedDataGridColumn      
    private function HeaderClick(event:AdvancedDataGridEvent):void 
      {
       clickedCol = AdvancedDataGridColumn(event.currentTarget.columns[event.columnIndex]);
    
      }
    


    第 4 部分:告诉比较函数如何使用列

    public function dateCompare(obj1:Object, obj2:Object):int 
            { 
             trace ("compare");
    
             var l:XML = obj1 as XML;
          var r:XML = obj2 as XML;
    
          var lDateStr:String = l.elements(clickedCol.dataField).valueOf()
          var rDateStr:String = r.elements(clickedCol.dataField).valueOf()
          // compare logic goes here
          }
    


    第 5 部分:构建/运行/盈利

    【讨论】:

      【解决方案2】:

      在外部(类级别)声明所有排序比较函数,并在运行时将适当的名称分配给 sortCompareFunction。

      【讨论】:

      • 这将是不切实际的,因为这些列中的大多数都是用户定义的。我无法想象如果我包含所有可能的组合,swf 会有多大,即使我限制了固定数量的小写字母字符。
      【解决方案3】:
      protected function headerReleaseHandler(event:AdvancedDataGridEvent):void
      {
        //event.dataField will give you column name
      
        //call sort compare fn
      }
      

      【讨论】:

        猜你喜欢
        • 2011-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-27
        • 2011-07-08
        • 1970-01-01
        相关资源
        最近更新 更多