[VB.NET]使用 LINQ 讓 DataTable 資料排序時不管 ASC 或 DESC 時 DBNull 排後面
問題描述
使用 DataView.Sort 的方式排序資料,當有 DBNull 資料時
使用 ASC 方式,DBNull 在上
使用 DESC 方式,DBNull 在下
如果想讓 DBNull 都在最後面的話,本文提供一種方式,使用 LINQ 讓 DataTable 資料排序時不管 ASC 或 DESC 時 DBNull 排後面
方法
Form 配置
程式碼
Public Class Form1
Dim dt As New DataTable ' 資料來源 DataTable
Dim sortColumn ' 指定排序的 Column
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
' 產生測試資料
dt.Columns.Add("Column")
dt.Rows.Add(New Object() {DBNull.Value})
dt.Rows.Add(New Object() {"D"})
dt.Rows.Add(New Object() {DBNull.Value})
dt.Rows.Add(New Object() {"A"})
dt.Rows.Add(New Object() {"C"})
dt.Rows.Add(New Object() {DBNull.Value})
dt.Rows.Add(New Object() {"Z"})
dt.Rows.Add(New Object() {DBNull.Value})
dt.Rows.Add(New Object() {"B"})
dgvData.DataSource = dt
' 指定排序欄位
sortColumn = dt.Columns("Column")
End Sub
' ASC 排序
Private Sub btnASC_Click(sender As System.Object, e As System.EventArgs) Handles btnASC.Click
'dt.DefaultView.Sort = "Column ASC"
Dim sortAsc = dt.AsEnumerable().OrderByDescending(Function(c) Not c(sortColumn).Equals(DBNull.Value)).ThenBy(Function(c) c(sortColumn))
dgvData.DataSource = sortAsc.AsDataView
End Sub
' DESC 排序
Private Sub btnDESC_Click(sender As System.Object, e As System.EventArgs) Handles btnDESC.Click
'dt.DefaultView.Sort = "Column DESC"
Dim sortDesc = dt.AsEnumerable().OrderByDescending(Function(c) Not c(sortColumn).Equals(DBNull.Value)).ThenByDescending(Function(c) c(sortColumn))
dgvData.DataSource = sortDesc.AsDataView
End Sub
End Class
執行結果
程式一開始執行時
按 ASC 按鈕
按 DESC 按鈕
範例下載
https://dotblogsfile.blob.core.windows.net/user/chou/1305/201352412758351.zip