2009-05-19 4 views
0

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

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

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

Благодаря

АСЭИ

+0

Какая база данных? – Andomar

ответ

0

Возможно обернуть столбец реализовать IComparable интерфейс, так что вы можете предоставить пользовательский вид, here is an example.

0

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

Поскольку ваш «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 

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

0

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

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

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

или

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

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

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) 
0

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

Смежные вопросы