Сортировка столбца строки DataTable, но с null / empty внизу
Мне нужно отсортировать DataTable или DataGridView по столбцу, который является строковым значением, но с нулевыми/пустыми значениями внизу при сортировке по возрастанию.
DataTable не заполняется инструкцией SQL, поэтому нет порядка.
Если я делаю
DataGridView1.Sort(New RowComparer(System.ComponentModel.ListSortDirection.Ascending))
затем он выдает исключение, говоря, что DataGridView-это DataBound, что правильно, но не помогает мне, и я хочу сохранить его databound.
это .NET 2.0, что означает отсутствие LINQ в наличии!
3 ответов
в некоторых случаях вы можете сделать это, если у вас есть еще один дополнительный столбец в таблице:
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"
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();
даже если DataTable, который вы привязываете к элементу управления пользовательского интерфейса DataGridView, не заполняется через SQL, вы все равно можете сортировать его с помощью DataView, вы можете сделать что-то вроде этого:
DataView myView = myDataTable.DefaultView;
myView,Sort = "yourColumnName ASC";
затем вы выполняете привязку.
как это работает? Являются ли значения null в верхней или в нижней части?