[C#] DataGridView Virtual Mode and Sort

這篇將介紹DataGridView Virtual Mode (with DataTable)  & Sort Function

雖然DataTable綁定DataGridView可以方便地呈現資料

但只要資料數過於龐大

DataGridView就會有反應速度遲緩的情形

因此需要使用Virtual Mode增進效能

可以參考:MSDN-DataGridView 控制項實作虛擬模式

裡面有各個Event的實作範例

而我使用的DataGridView只需要ReadOnly

因此我參考:[WinForm] DataGridView 虛擬模式 實作

有較為簡單明瞭的範例


以下是我的實作方法

DataGridView dgvData = new DataGridView();
DataTable dtSource;

private void Initial()
{
  dgvData.VirtualMode = true;
  dgvData.RowCount = dtSource.Rows.Count;
}

private void dgvData_CellValueNeeded(object sender,DataGridViewCellValueEventArgs e)
{
    if (e.RowIndex == dgvData.RowCount - 1) return;
    
    switch (dgvData.Columns[e.ColumnIndex].Name)
    {
        case "ColName_dgv_1":
            e.Value = dtSource.Rows[e.RowIndex]["ColName_dt_1"];
            break;
        case "ColName_dgv_2":
            e.Value = dtSource.Rows[e.RowIndex]["ColName_dt_2"];
            break;      
    }
}

簡單整理一下操作順序:

  1. 準備好DataGridView與DataTable
  2. 設定DataGridView.VirtualMode = true
  3. 設定DataGridView行列數等於DataTable
  4. 改寫CellValueNeeded事件,對應DataGridView與DataTable的欄位名稱。

實作完Virtual Mode後,馬上就碰到一個問題

由於DataTable資料並沒有全部讀入

因此原先在DataGridView上的Sort Function失效了

好吧,只好再度自行改寫

private void dgvData_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    
    switch (e.ColumnIndex)
    {
        case 0:
            SetDgvSort(0, "ColName_dt_1");
            break;
        case 1:
            SetDgvSort(1, "ColName_dt_2");
            break;
    }
    //於DefaultView排序後再取回
    dtSource = dtSource.DefaultView.ToTable();
    
    dgvData.Rows.Clear();
    dgvData.RowCount = dtSource.Rows.Count;
    dgvData.Refresh();
}

private void SetDgvSort( int iCol, string strColName)
{
    string strSort = "";
    if (iSortCol == iCol)//第二次點擊,做遞減排序
    {
        strSort = "DESC";
        iSortCol = -1;
    }
    else
    {
        strSort = "ASC";
        iSortCol = iCol;
    }

    dtData.DefaultView.Sort = strColName +  " " + strSort;
}

整理一下內容

  1. 改寫Event: ColumnHeaderMouseClick
  2. 設定DataTable.DefaultView.Sort = “ColName ASC" (or DESC)
  3. 將DataTable.DefaultView回存至DataTable
  4. Refresh DataGridView

此方法實際上是對DataTable做排序

然後再讓DataGridView重新讀取排序後的DataTable

 

 

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s