DataGridView的虛模式填充(大數據的填充)

DataGridView是.net 2.0新增的表格數據編輯和顯示控件,簡單的數據顯示和編輯,只需直接和數據源綁定就可以了。
對於 一些特殊情況,我們需要自己填充DataGridView,這時候只需要按照行列順序,首先獲得行,然後通過行的Cells屬性,得到單元格,設置其 Value屬性即可。但這種模式有個問題,即對於幾十行或者幾百行的數據,顯示效率不是問題,當數據量逐漸增大時,效率就成了一個非常重要的問題。
那麼,如何解決這樣的問題呢,寫過或者看過類似Grid控件的朋友一定會想到,按需加載數據。也就是當我們在數據表格中移動時,顯示到屏幕上的數據只是實際 需要的數據的一部分,那麼,只加載這部分數據即可。而對於DataGridView,一切都準備好了,只要我們開啓VirtualMode,然後實現幾個 事件(用於加載保存數據),其他的事情DataGridView會替我們做好。
在WinForm窗體中添加一個DataGridView控件,設置VirtualMode屬性爲True。

實現如下事件:
第一個需要實現的事件是:CellValueNeeded,該事件在控件刷新,需要爲單元格填充數據時發生,其參數e返回當前單元格的行和列,根據行和列,獲取需要的值,賦給e的Value屬性。
如果只是顯示數據,該事件已足夠,從理論上,通過這樣的方法,DataGridView顯示的數據與數據量無關,即使數據量再大,也可以在常數時間內完成刷新。
第二個需要實現的事件是CellValuePushed,該事件在一個單元格編輯完成後觸發,將數據寫回數據源。其中事件的參數e會返回單元格的行、列、值。
如果要添加行和刪除行,則需要實現NewRowNeeded和UserDeletingRow事件。還有其他一些事件,來控制放棄單元格、行的編輯等事件。具體可以參考幫助文檔。
總之,使用虛擬模式,一方面可以很好的爲DataGridView控件加載數據,另一方面,也可以達到數據和顯示分離的目的。
案例:

 綁定數據到DataGridView上。

下邊代碼中的dgvWage爲DataGridView。本例在加載時要顯示數據,所以在加載時取出資料,保存到dtWork中,但不綁定到DataGridView上。只設置DataGridView的RowCount屬性。
        DataTable dtWork = null;
private void FrmCountWage_Load(object sender, EventArgs e)
        {
            GetWorkDayByDate(DateTime.Now);
        }
///得到數據,
private void GetWorkDayByDate()
        {
string sql = @"SELECT * from xx";
            sql = string.Format(sql, date.ToString("yyyy-MM-dd"));
            dtWork = dal.GetDatatableData(sql);
///不使用綁定數據,綁定在 CellValueNeeded事件中處理
///dgvWage.DataSource = dtWork;
///設置DataGridView的行數
            dgvWage.RowCount = dtWork.Rows.Count;
        }

在CellValueNeeded事件是綁定數據。CellValueNeeded是一格一格將數據設置上去了,而且暫時不需要的數據不設置。下邊爲綁定DataTable到DataGridView上。

private void dgvWage_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
        {
if (e.RowIndex==dgvWage.RowCount)
            {
return;
            }
/// 從記錄集中讀取數據   
string colName = dgvWage.Columns[e.ColumnIndex].DataPropertyName;
            e.Value = dtWork.Rows[e.RowIndex][colName].ToString();
        }

這樣Virtual Mode用法介紹完成。

發佈了2 篇原創文章 · 獲贊 9 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章