Расширение Flex DataGridColumn для пользовательской функции сортировки - PullRequest
0 голосов
/ 26 августа 2009

Я расширил DataGridColumn, потому что хотел включить пользовательскую функцию itemToLabel (чтобы можно было показывать вложенные данные в DataGrid. См. этот вопрос.

В любом случае, для этого также требуется настраиваемая функция сортировки. Итак, я написал функцию сортировки следующим образом:

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 я поместил: супер (ColumnName); sortCompareFunction = mySortCompareFunction;

Всякий раз, когда я пытаюсь отсортировать столбец, я получаю сообщение об ошибке "Error: Find criteria must contain at least one sort field value."

Когда я отлаживаю и выполняю каждый шаг, я вижу, что первые несколько раз функция вызывается правильно, но ближе к концу эта ошибка возникает.

Может кто-нибудь пролить свет на то, что здесь происходит?

Спасибо.

Ответы [ 4 ]

1 голос
/ 07 октября 2010

Самый простой способ решить эту проблему - изменить dataField = "obj.atributte" на labelFunction. Если вы хотите, вы также можете добавить функцию 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);
1 голос
/ 26 августа 2009

Просто чтобы указать, как именно я решил эту проблему (для блага других):

Вместо использования свойства 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
}
}

Затем я присваиваю этой новой переменной свою запись в dataField

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

И о чудо! это работает безотказно.

1 голос
/ 19 мая 2010

Мне часто проще использовать стандартное поле данных и просто написать функцию получения в моем объекте значения для использования в качестве поля данных. Например:

//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"/>
1 голос
/ 26 августа 2009

Я тоже видел эту ошибку и отследил ее до одной из ячеек, содержащих 'null'. И если я правильно помню, эта ошибка также появляется, когда один из столбцов имеет неправильный атрибут «dataField».

НТН,

Коэн Вейн

...