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用法介紹完成。