代码之家  ›  专栏  ›  技术社区  ›  Anand

扩展Flex DataGridColumn以实现自定义排序功能

  •  0
  • Anand  · 技术社区  · 15 年前

    我扩展了DataGrid列,因为我想包含一个自定义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的构造函数中,我将: 超级(列名); SortComparenction=mySortCompareFunction;

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

    当我调试并逐步完成每个步骤时,我看到前几次,函数被正确调用,但在接近结束时,出现了这个错误。

    谢谢

    4 回复  |  直到 7 年前
        1
  •  1
  •   Koen Weyn    15 年前

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

    科恩·韦恩

        2
  •  1
  •   Anand    15 年前

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

    dataField data.name , data.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
    }
    }
    

    然后,我将数据字段条目分配给这个新变量

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

        3
  •  1
  •   David Vermeir    14 年前

    我经常发现使用标准数据字段更容易,只需在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
  •  1
  •   AntuanF1    14 年前

        <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);
    
    推荐文章