Модераторы: gambit, Partizan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Корректная сортировка даты 
:(
    Опции темы
m9yt
Дата 13.6.2013, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



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

Есть какие - то идеи?
PM MAIL   Вверх
gambit
Дата 13.6.2013, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: нет
Всего: 40



Они отсортированы как строки содержащие даты. Надо копать в этом направлении
PM MAIL ICQ Skype   Вверх
m9yt
Дата 13.6.2013, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



В общем, разобрался с сортировкой добавлением класса сортировки. Теперь вопрос: как отловить событие, которое происходит при нажатии на заголовок столбца, при котором, собственно, и сортируется столбец.
PM MAIL   Вверх
m9yt
Дата 13.6.2013, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) m9yt - 13.6.2013, 14:48
PM MAIL   Вверх
diadiavova
Дата 13.6.2013, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



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

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

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

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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
m9yt
Дата 13.6.2013, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Да, событие SortCompare.
Насчет типа данных: я указывал тип typeof(DateTime) - безрезультатно.
PM MAIL   Вверх
diadiavova
Дата 13.6.2013, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



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

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

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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
m9yt
Дата 13.6.2013, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



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

dataGridView1.Columns.Add("", "Дата");
dataGridView1.Columns[0].ValueType = typeof(DateTime);
PM MAIL   Вверх
diadiavova
Дата 13.6.2013, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



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

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

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  dgvsort.rar 71,44 Kb


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
m9yt
Дата 13.6.2013, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



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

e.Handled = true;

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

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

Естественно строки, НО в формате даты.
В этом - то и проблема. Поэтому и пришлось писать свой класс, который берет данные ячейки и перегоняет их в дату.
Теперь осталось решить вопрос с нажатием на заголовок столбца, чтобы применялась лишь моя сортировка, а стандартная отбрасывалась.
PM MAIL   Вверх
diadiavova
Дата 13.6.2013, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



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

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

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

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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
m9yt
Дата 13.6.2013, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Цитата(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;

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

Это сообщение отредактировал(а) m9yt - 13.6.2013, 19:23
PM MAIL   Вверх
diadiavova
Дата 13.6.2013, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



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

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

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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
m9yt
Дата 13.6.2013, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



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

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


Это сообщение отредактировал(а) m9yt - 13.6.2013, 19:46
PM MAIL   Вверх
diadiavova
Дата 13.6.2013, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



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

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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0761 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.