【问题标题】:Extending Flex DataGridColumn for custom sorting function为自定义排序功能扩展 Flex DataGridColumn
【发布时间】:2010-11-22 18:35:17
【问题描述】:

我扩展了 DataGridColumn,因为我想包含一个自定义 itemToLabel 函数(以便能够在 DataGrid 中显示嵌套数据。请参阅this 问题。

无论如何,它还需要一个自定义排序功能。所以我写了这样的排序函数:

private function mySortCompareFunction(obj1:Object, obj2:Object):int{
    var currentData1:Object = obj1;
    var currentData2:Object = obj2;

    //some logic here to get the currentData if the object is nested.

    if(currentData1 is int && currentData2 is int){
        var int1:int = int(currentData1);
        var int2:int = int(currentData2);
        var result:int = (int1>int2)?-1:1; 
        return result;
    }
    //so on for string and date
}

在我的 CustomDataGridColumn 的构造函数中,我放了: 超级(列名); sortCompareFunction = mySortCompareFunction;

每当我尝试对列进行排序时,都会收到错误“Error: Find criteria must contain at least one sort field value.

当我调试并逐步执行每个步骤时,我看到前几次,函数被正确调用,但到最后,出现此错误。

有人可以解释一下这里发生了什么吗?

谢谢。

【问题讨论】:

    标签: apache-flex datagrid adobe


    【解决方案1】:

    我也看到了这个错误,我将其追踪到包含“null”的单元格之一。 如果我没记错的话,当其中一列的“dataField”属性错误时,也会出现此错误。

    第,

    科恩·韦恩

    【讨论】:

    • 我想你刚刚解决了我迄今为止花费了近 6 个小时的问题。谢谢你。如果可以的话,我会更多地投票给你;)
    【解决方案2】:

    只是为了说明我是如何解决这个问题的(为了他人的利益):

    我没有使用dataField 属性(我分配了data.namedata.title 之类的东西,因为我从嵌套对象中获取数据),而是创建了自己的字段nestedDataField 并使其可绑定。所以我的代码现在基本上是这样的:

    public class DataGridColumnNested extends DataGridColumn{
    [Bindable] public var nestedDataField:String;
    
    private function mySortCompareFunction(obj1:Object, obj2:Object):int{
        var currentData1:Object = obj1;
        var currentData2:Object = obj2;
    
        //some logic here to get the currentData if the object is nested.
    
        if(currentData1 is int && currentData2 is int){
            var int1:int = int(currentData1);
            var int2:int = int(currentData2);
            var result:int = (int1>int2)?-1:1; 
            return result;
        }
        //so on for string and date
    }
    }
    

    然后我将我的 dataField 条目分配给这个新变量

    <custom:DataGridColumnNested headerText="Name" nestedDataField="data.name"/>
    

    你瞧!它工作顺利。

    【讨论】:

      【解决方案3】:

      我经常发现使用标准数据字段更容易,只需在我的 valueobject 中编写一个 getter 函数以用作数据字段。 例如:

      //file SomeObject.as with a nested object as property
      public class SomeObject
      {
         public var someProperty:AnotherObject;
      
         public function get someString():String;
         {
           if(someProperty)
              return someProperty.someString;
           else
              return "";
         }
      }
      
      //your nested class, AnotherObject.as
      public class AnotherObject
      {
         public var someString:String;
      }
      
      //this way sorting and the label will work without custom label/compare functions
      <mx:DataGridColumn headerText="" dataField="someString"/>
      

      【讨论】:

        【解决方案4】:

        解决问题的最简单方法是通过 labelFunction 更改 dataField="obj.atribute"。如果你愿意,你也可以添加一个 sortCompareFunction。

            <mx:DataGridColumn headerText="email" 
        dataField="user.email" textAlign="center" />
        

        改变

            <mx:DataGridColumn headerText="email" 
        labelFunction="emailLabelFunction" 
        sortCompareFunction="emailsCompareFunction2" 
        textAlign="center" />
        
        
        
        public static function emailLabelFunction(item:Object, column:DataGridColumn):String{
        
           if (item!=null){
            var user:User = (item as TpAnnouncementUser).user as User;
        
            return user.email;
           }else{
        
            return "";
           }
        }
        

        public static function emailCompareFunction(obj1:Object, obj2:Object):int{
        
            var dato1:String = User(obj1).email.toLowerCase();
            var dato2:String = User(obj2).email.toLowerCase();
        
            return ObjectUtil.compare(dato1, dato2);
        
        }
        
        
            public static function emailsCompareFunction2(obj1:Object, obj2:Object):int{
        
            var dato3:User = (TpAnnouncementUser(obj1).user as User);
            var dato4:User = (TpAnnouncementUser(obj2).user as User);
        
            return emailCompareFunction(dato3, dato4);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-21
          • 2012-03-12
          • 2021-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多