Как отсортировать столбец DataGrid

У меня есть сетка данных, которая содержит данные, извлеченные из базы данных, и сетка данных отображает данные в том же формате, что и в базе данных.

Один из столбцов — DateFrom, который я хотел бы отсортировать. Датаформа хранится в базе данных как Varchar, поэтому сортируется по алфавиту, например 2/2004, 2/2008, 4/2003. Я хочу преобразовать DatFrom в тип DateTime и отсортировать значения в числовом виде перед отображением в сетке данных.

Есть ли способ сделать это?

Спасибо

Айн


person Community    schedule 19.05.2009    source источник


Ответы (5)


Я создал небольшую демонстрационную таблицу (тест). Вставил несколько тестовых дат и сделал запрос на выборку:

Create Table test(dt varchar(10))
Go
Insert Into test(dt)
Select '2/2004'
Union Select '2/2008'
Union Select '4/2003'
Go

Select *
From test
Order By Convert(datetime, '1/' + dt, 103)
person a programmer    schedule 19.05.2009

Вероятно, оберните столбец, чтобы реализовать интерфейс IComparable, чтобы вы могли предоставить собственную сортировку, вот пример.

person Seba Illingworth    schedule 19.05.2009

Кажется, я понимаю, о чем вы здесь спрашиваете. Дайте мне знать, если я ошибаюсь. Я думаю, что самый простой способ исправить это — использовать оператор select для получения ваших данных из базы данных, но это не обязательно лучший метод. Вот что я придумал:

Поскольку ваш «DateFrom» имеет формат «MM/yyyy», вы не сможете выполнить прямую операцию CAST(). Лучший способ получить действительное значение DATETIME, о котором я могу думать, - это проанализировать текущий столбец DateFrom и обработать все даты как первые числа месяца, после чего вы можете установить формат "MM/yyyy" в столбце datagrid , и он все равно будет отображаться правильно. Оператор CAST() может быть примерно таким:

SET DATEFORMAT MDY

SELECT CAST(SUBSTRING(DateFrom, 0, CHARINDEX('/',DateFrom))
        + '/1/'
        + SUBSTRING(DateFrom, CHARINDEX('/',DateFrom) +1, 4) AS DATETIME) AS DateFrom

Я знаю, что это не самый элегантный метод, но он должен работать, если ваш формат даты постоянен. Удачи!

person Scott Anderson    schedule 19.05.2009

Я не уверен, понял ли я ваш вопрос. Тем не менее, как насчет сортировки строк на стороне SQL с помощью чего-то вроде:

SELECT ...
ORDER BY Substring(DateFrom, CHARINDEX('/', DateFrom) + 1, 4) 
         + Lpad(DateFrom, 7, '0');

Он изменит исходный 2/1999 на 199902/1999, чтобы его можно было сравнить как строку. Часть после косой черты есть только потому, что я не хотел обрезать строку, поскольку она не нужна.

or

SELECT ...
ORDER BY Cast(int, 
              Substring(DateFrom, CHARINDEX('/', DateFrom) + 1, 4) 
       * 100 
       + Cast(int, 
              Substring(DateFrom, 1, CHARINDEX('/', DateFrom));
person gius    schedule 19.05.2009

Спасибо вам, ребята. Я посмотрю на это. Я должен бросить этот проект на некоторое время. Я дам вам знать, смогу ли я заставить его работать или нет.

person Community    schedule 11.06.2009