[VB.NET]使用 LINQ 讓 DataTable 資料排序時不管 ASC 或 DESC 時 DBNull 排後面

  • 4671
  • 0

[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