Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Корректная сортировка даты


Автор: m9yt 13.6.2013, 13:17
Добрый день.
У меня есть dataGridView, в котором один из столбцов заполнен датами в формате dd.mm.yyyy.
При сортировке столбца даты корректно не сортируются.
Например, такие значения отсортировать не получается:
"01.11.2007"
"02.09.2010"
"02.11.2007"
"06.02.2008"
"10.06.2006"

Есть какие - то идеи?

Автор: gambit 13.6.2013, 13:36
Они отсортированы как строки содержащие даты. Надо копать в этом направлении

Автор: m9yt 13.6.2013, 14:01
В общем, разобрался с сортировкой добавлением класса сортировки. Теперь вопрос: как отловить событие, которое происходит при нажатии на заголовок столбца, при котором, собственно, и сортируется столбец.

Автор: m9yt 13.6.2013, 14:48
Событие отловил, но проблема в том, что, даже если я вставлю туда свой код сортировки, столбец все равно потом отсортируется неправильно по умолчанию. Можно ли как - то отключить сортировку по умолчанию, но при это оставить рабочим глиф сортировки и кнопку соответственно?

Автор: diadiavova 13.6.2013, 15:12
Цитата(m9yt @  13.6.2013,  15:48 Найти цитируемый пост)
Событие отловил, но проблема

О каком событии речь? Ты не пишешь, что конкретно сделал, но ждешь, что тебе помогут в решении возникших при этом проблем. Если это было событие SortCompare, то в конце надо пометить его обработанным
Код

e.Handled = true;
если же ты отловил что-то другое - напиши что именно.

Добавлено через 2 минуты и 22 секунды
А вообще даты грид и так прекрасно сортирует и для этого не надо велосипед изобретать. Надо просто корректно указать тип данных столбца и убедиться в том, что используемый формат даты соответствует применяемой культуре.

Автор: m9yt 13.6.2013, 15:21
Да, событие SortCompare.
Насчет типа данных: я указывал тип typeof(DateTime) - безрезультатно.

Автор: diadiavova 13.6.2013, 15:33
Цитата(m9yt @  13.6.2013,  16:21 Найти цитируемый пост)
Да, событие SortCompare.

Тогда сделай как я написал
Цитата(m9yt @  13.6.2013,  16:21 Найти цитируемый пост)
Насчет типа данных: я указывал тип typeof(DateTime) - безрезультатно. 

Где ты его указывал? Его надо указывать в свойствах столбца. Там по умолчанию стоит String, вот оно и сортируется как строки. Ты когда создавал столбцы для таблицы свойства как-нибудь настраивал?

Автор: m9yt 13.6.2013, 15:49
Цитата(diadiavova @ 13.6.2013,  15:33)
Где ты его указывал?

dataGridView1.Columns.Add("", "Дата");
dataGridView1.Columns[0].ValueType = typeof(DateTime);

Автор: diadiavova 13.6.2013, 16:20
Цитата(m9yt @  13.6.2013,  16:49 Найти цитируемый пост)
dataGridView1.Columns[0].ValueType = typeof(DateTime); 

А в ячейки ты что добавлял, даты или строки?
Я вот написал проект, правда когда создавал, не посмотрел, что он на VB.Net, но там код простейший, думаю проблем не вызовет. Все работает нормально. Проект в аттаче

Автор: m9yt 13.6.2013, 16:31
Цитата(diadiavova @ 13.6.2013,  15:12)
Если это было событие SortCompare, то в конце надо пометить его обработанным
Код

e.Handled = true;

Просто вписал эту единственную строчку в обработчик - ничего не изменилось.
Какова тогда ее суть?

Добавлено через 3 минуты и 36 секунд
Цитата(diadiavova @ 13.6.2013,  16:20)
А в ячейки ты что добавлял, даты или строки?

Естественно строки, НО в формате даты.
В этом - то и проблема. Поэтому и пришлось писать свой класс, который берет данные ячейки и перегоняет их в дату.
Теперь осталось решить вопрос с нажатием на заголовок столбца, чтобы применялась лишь моя сортировка, а стандартная отбрасывалась.

Автор: diadiavova 13.6.2013, 16:41
Цитата(m9yt @  13.6.2013,  17:31 Найти цитируемый пост)
Естественно строки, НО в формате даты.

Почему естественно? Я вот добавил даты и все нормально сортируется. 
Цитата(m9yt @  13.6.2013,  17:31 Найти цитируемый пост)
Какова тогда ее суть?

После ее выполнения сортировка продолжаться не должна. У тебя ведь в этом проблема?

Добавлено @ 16:44
Ты, кстати, SortMode для столбца правильно установил?

Автор: m9yt 13.6.2013, 19:09
Цитата(diadiavova @ 13.6.2013,  16:41)
Цитата(m9yt @  13.6.2013,  17:31 Найти цитируемый пост)
Естественно строки, НО в формате даты.

Почему естественно? Я вот добавил даты и все нормально сортируется. 
Цитата(m9yt @  13.6.2013,  17:31 Найти цитируемый пост)
Какова тогда ее суть?

После ее выполнения сортировка продолжаться не должна. У тебя ведь в этом проблема?

Добавлено @ 16:44
Ты, кстати, SortMode для столбца правильно установил?

Ну потому что в ячейку данные записываются вот так:
Код

dataGridView.Rows[0].Cells[0].Value = "01.01.1990";

и т.д.
SortMode = DataGridViewColumnSortMode.Automatic;

После выполнения той (единственной) строки в обработчике самая первая строчка остается на месте, остальные сортируются по-старому - как строки.

Автор: diadiavova 13.6.2013, 19:35
Цитата(m9yt @  13.6.2013,  20:09 Найти цитируемый пост)
Ну потому что в ячейку данные записываются вот так:

Во-первых, от этого строка не перестает быть строкой и не становится датой. Во-вторых, не вижу ничего естественного в том, что ты загоняешь данные в виде строк, а ждешь, что сортироваться они будут как даты. Я тебе сказал уже, что надо загонять туда даты и даже пример выложил, где все сортируется правильно.
Цитата(m9yt @  13.6.2013,  20:09 Найти цитируемый пост)
SortMode = DataGridViewColumnSortMode.Automatic;

И получаешь режим, используемый по умолчанию, но коль скоро сортировка у тебя программная, то видимо и режим надо задать Programatic. Не? smile Ну я правда не знаю точно, сам не пользуюсь обычно добавлением данных непосредственно в грид, для этого есть датасет и привязка данных, но по логике-то вещей...

Автор: m9yt 13.6.2013, 19:43
Можно сделать так (просто после получения данных перегонять столбец в даты). Может это и будет медленно на больших таблицах, но зато выглядит лучше, чем всякие костыли, и сортируется автоматически.
Код

private void ConvertToDate(DataGridViewRowCollection rows)
{
    foreach (DataGridViewRow row in rows)
    {
        row.Cells[0].Value = Convert.ToDateTime(row.Cells[0].Value);
    }
}

Автор: diadiavova 13.6.2013, 19:45
Цитата(m9yt @  13.6.2013,  20:43 Найти цитируемый пост)
Можно сделать так (просто после получения данных перегонять столбец в даты):

Зачем? smile  Почему сразу даты туда не загонять? smile 

Автор: m9yt 13.6.2013, 19:47
Ну механизм заполнения таблицы из базы делал не я. И раз стандартной сортировкой не сортируется, значит у них загоняется в виде строк...
Нужно будет у них уточнить.

Автор: diadiavova 13.6.2013, 19:49
Цитата(m9yt @  13.6.2013,  20:47 Найти цитируемый пост)
Ну механизм заполнения таблицы из базы делал не я. И раз стандартной сортировкой не сортируется, значит у них загоняется в виде строк...

Ну тогда да - придется какой-нибудь костыль мастерить.
Цитата(m9yt @  13.6.2013,  20:47 Найти цитируемый пост)
Нужно будет у них уточнить. 

просто запроси экземпляр и проверь его тип.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)