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控制項載入資料,另一方面,也可以達到資料和顯示分離的目的。
轉自:http://www.cnblogs.com/maweifeng/archive/2006/09/17/506574.html
案例:
綁定資料到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用法介紹完成。