Сортировка столбца строки 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 в верхней или в нижней части?