Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Сортировка по дате в Datagrid-е (http://www.flasher.ru/forum/showthread.php?t=127415)

Bruiser 13.07.2009 18:29

Сортировка по дате в Datagrid-е
 
Есть датагрид
Код:

<mx:AdvancedDataGrid id="adg" left="10" right="10" bottom="10" top="40" horizontalScrollPolicy="auto" alternatingItemColors="[#dadada, #eeeeee]"
                headerWordWrap="true" sortExpertMode="false">
                <mx:columns>
                        <mx:AdvancedDataGridColumn dataField="TP_NAME" headerText="Тарифный план" width="280"/>
                        <mx:AdvancedDataGridColumn dataField="DATE_FROM" headerText="Начало продаж" width="140"/>                       
                        <mx:AdvancedDataGridColumn dataField="DATE_TO" headerText="Конец продаж" width="140"/>       
                </mx:columns>
        </mx:AdvancedDataGrid>

Заполнение данных
Код:


var arr:ArrayCollection = new ArrayCollection();
for each(var x:XML in myXML.data.children()){
        arr.addItem({
                        TP_NAME:x.TP_NAME,
                        DATE_FROM:x.DATE_FROM,
                        DATE_TO:x.DATE_TO
        });
}                                       
adg.dataProvider = arr;

Функция сортировки
Код:

private function sortDate(obj1:Object, obj2:Object):int
{
  var d1:Number = (new Date(Date.parse(obj1.date))).getTime();
  var d2:Number = (new Date(Date.parse(obj2.date))).getTime();
  if(d1 < d2) {
    return -1;
  } else if(d1 == d2) {
    return 0;
  }
  return 1;
}

ошибка возникает при парсинге даты. В чем может быть проблема?

wvxvw 13.07.2009 19:53

А где вы видите у obj1 свойство date?
Даже если оно там есть, то сказать в чем ошибка вам никто не сможет, потому что неизвесно чему оно равно.
Кроме того, свойства со строчной, для таких операций используйте valueObject'ы со строгой типизацией, и храните свойство date как Date или Number - в зависимости от того, что нужнее, это крайне непродуктивно заниматься парсингом датапровайдера каждый раз, когда нужно таблицу отсортировать. И не используйте выражения, которые нужно пересчитывать в условии for / for-each и т.п.

Bruiser 14.07.2009 14:23

Да, я там ошибся obj1.DATE_FROM и obj2.DATE_FROM
Вот эта
Код:

private function sortDate(obj1:Object, obj2:Object):int
{
  var d1:Number = (new Date(Date.parse(obj1.DATE_FROM))).getTime();
  var d2:Number = (new Date(Date.parse(obj2.DATE_FROM))).getTime();
  if(d1 < d2) {
    return -1;
  } else if(d1 == d2) {
    return 0;
  }
  return 1;
}

А поясните насчет этого
Цитата:

Кроме того, свойства со строчной, для таких операций используйте valueObject'ы со строгой типизацией, и храните свойство date как Date или Number - в зависимости от того, что нужнее, это крайне непродуктивно заниматься парсингом датапровайдера каждый раз, когда нужно таблицу отсортировать. И не используйте выражения, которые нужно пересчитывать в условии for / for-each и т.п.

wvxvw 14.07.2009 16:18

свойства со строчной:
obj1.DATE_FROM ----> obj1.dateFrom

valueObject'ы со строгой типизацией
Код AS3:

public class SomeValueObject
{
public var dateFrom:Date;
public var dateTo:Date;
public var name:String;
 
public function SomeValueObject(dateFrom:Date, dateTo:Date, name:String)
{
super();
this.dateFrom = dateFrom;
this.dateTo = dateTo;
this.name = name;
}
}

Код AS3:

//
arr.addItem(new SomeValueObject(new Date(x.DATE_FROM),
                new Date(x.DATE_TO),
                x.TP_NAME));
//


Bruiser 16.07.2009 16:42

А как правильно парсить Date из строки?
Я делаю вот так
Код:

var str:String = "01.12.2008";
var dt = new Date(Date.parse(str));

И в итоге не получается

Понял, что если поменять формат числа, то все норм
Код:

var str:String = "01/12/2008";
var dt = new Date(Date.parse(str));

Что нужно сделать, чтобы можно было нормально парсить с точками?

wvxvw 16.07.2009 17:49

Код AS3:

var dt = new Date(Date.parse(str));

Избыточно, и не должно компилироваться, должно быть так:
Код AS3:

var dt:Date = new Date(str);

Заменить точки - слешами - RegExp вам в руки... ну или напишите, в каком формате вам даты отдают. А еще лучше - отпинать умника, который туда точки поставил, есть стандарты, как дату записывать, а за самодеятельность приходится платить :)

Bruiser 16.07.2009 17:55

Вложений: 1
Сделал вот так
Код:

var DATE_FROM:String = "01.12.2008";
var arr:Array = DATE_FROM.split(".");                                       
this.DATE_FROM = new Date(arr[2],arr[1]-1,arr[0]);

Но теперь загвостка в том, что неправильно отображается дата в таблице
Хотя формат такой стоит
Код:

<mx:DateFormatter id="dateFormat" formatString="DD.MM.YYYY" />       
<mx:AdvancedDataGrid id="adg" left="10" right="10" bottom="10" top="40" horizontalScrollPolicy="auto" alternatingItemColors="[#dadada, #eeeeee]"
                headerWordWrap="true" sortExpertMode="false">
        <mx:columns>
                <mx:AdvancedDataGridColumn dataField="DATE_FROM" headerText="Начало продаж" width="140" formatter="{dateFormat}"/>                       
                <mx:AdvancedDataGridColumn dataField="DATE_TO" headerText="Конец продаж" width="140" formatter="{dateFormat}"/>               
        </mx:columns>
</mx:AdvancedDataGrid>


Bruiser 20.07.2009 10:23

Неужели никто никогда не сталкивался?

wvxvw 20.07.2009 18:07

не знаю, я вообще не понимаю, что это оно у вас показывает :)

Bruiser 20.07.2009 18:08

Цитата:

Сообщение от wvxvw (Сообщение 836851)
не знаю, я вообще не понимаю, что это оно у вас показывает :)

2008 год отображается как 300, а 2009 год - 400


Часовой пояс GMT +4, время: 18:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.