2011-02-07 2 views
9

Мне нужно отсортировать DataTable или DataGridView столбцом, являющимся строковым значением, но с нулевыми/пустыми значениями в BOTTOM при сортировке ASCENDING.Сортировка столбца строки данных DataTable, но с нулевым/пустым внизу

DataTable не заполняется оператором SQL, поэтому порядок не указан.

Если я

DataGridView1.Sort(New RowComparer(System.ComponentModel.ListSortDirection.Ascending)) 

то бросает исключение, сказав, что DataGridView является DataBound, что это правильно, но не помогает мне, и я хочу, чтобы сохранить его с привязкой к данным.

Это .NET 2.0, что означает отсутствие LINQ!

ответ

8

в некоторых случаях вы могли бы это сделать, если у вас есть еще один дополнительный столбец в вашей таблице:

SELECT completed, completed IS NULL AS isnull 
FROM TABLE 
ORDER BY isnull DESC, completed DESC 



Edit:
Как это в VB.NET

 For Each srSearchResult In srcSearchResultCollection 

      Try 
       dr = dt.NewRow() 
       dr("cn") = srSearchResult.GetDirectoryEntry().Properties("cn").Value 
       dr("Account") = srSearchResult.GetDirectoryEntry().Properties("sAMAccountName").Value 
       dr("Nachname") = srSearchResult.GetDirectoryEntry().Properties("sn").Value 
       dr("Vorname") = srSearchResult.GetDirectoryEntry().Properties("givenname").Value 
       dr("Mail") = srSearchResult.GetDirectoryEntry().Properties("mail").Value 
       dr("HomeDirectory") = srSearchResult.GetDirectoryEntry().Properties("homedirectory").Value 
       dr("LogonScript") = srSearchResult.GetDirectoryEntry().Properties("scriptPath").Value 

       dr("IsNull") = String.IsNullOrEmpty(dr("Nachname").ToString()) 

       dt.Rows.Add(dr) 
      Catch ex As Exception 

      End Try 

     Next srSearchResult 
dt.DefaultView.Sort = "IsNull ASC, Nachname ASC" 
+0

не работает –

+1

@Waqas Raja: Это грязно, но он работает! Забавно, я как-то всегда пропустил простейшие решения. –

+0

Прохладный, тогда вы можете задать свой ответ в качестве ответа ;-) –

0

даже если DataTable вы связываете с управляющим пользовательским интерфейсом DataGridView не заполняются через SQL, вы можете отсортировать его с помощью DataView, вы можете сделать что-то вроде этого:

DataView myView = myDataTable.DefaultView; 
myView,Sort = "yourColumnName ASC"; 

, то вы делаете ваше связывание ,

как это работает? Нулевые значения в верхней или нижней части?

+0

да, но это не будет помещать нулевые/пустые значения внизу. –

+0

@ Вакас Раджа: Именно! Это моя проблема ... –

+0

Уверен, это именно то, что я сделал, просто вы не совсем поняли, что вопрос заключается в том, чтобы получить null/empty внизу, что точно так и не происходит. –

7

Davide Piras имеет хорошее решение, однако есть еще одно простейшее решение. У меня есть

Добавить новую колонку и сделать ее только одной строкой

// just, add a new column 
ActualDataTable.Columns.Add("NullEmptyCheck", typeof(int), "ColumnNameToSort is Null OR ColumnNameToSort = ''"); 

// apply sort expression 
ActualDataTable.DefaultView.Sort = "NullEmptyCheck asc, ColumnNameToSort asc"; 
// pass datasource to grid 
MyGridView.DataSource = ActualDataTable.DefaultView; 
MyGridView.DataBind();