虛模式填充常用來處理大量數據,某個字段的顯示問題。
DataGridView是.net 2.0新增的表格數據編輯和顯示控件,簡單的數據顯示和編輯,只需直接和數據源綁定就可以了。
對於 一些特殊情況,我們需要自己填充DataGridView,這時候只需要按照行列順序,首先獲得行,然后通過行的Cells屬性,得到單元格,設置其 Value屬性即可。但這種模式有個問題,即對於幾十行或者幾百行的數據,顯示效率不是問題,當數據量逐漸增大時,效率就成了一個非常重要的問題。
那么,如何解決這樣的問題呢,寫過或者看過類似Grid控件的朋友一定會想到,按需加載數據。也就是當我們在數據表格中移動時,顯示到屏幕上的數據只是實際 需要的數據的一部分,那么,只加載這部分數據即可。而對於DataGridView,一切都准備好了,只要我們開啟VirtualMode,然后實現幾個 事件(用於加載保存數據),其他的事情DataGridView會替我們做好。
在WinForm窗體中添加一個DataGridView控件,設置VirtualMode屬性為True。
CellValueNeeded,該事件在控件刷新,需要為單元格填充數據時發生,其參數e返回當前單元格的行和列,根據行和列,獲取需要的值,賦給e的Value屬性。
如果只是顯示數據,該事件已足夠,從理論上,通過這樣的方法,DataGridView顯示的數據與數據量無關,即使數據量再大,也可以在常數時間內完成刷新。
-------------------------以上內容引用自:https://blog.csdn.net/qq_30122639/article/details/53739607---------------------------------------------------------------------------
CellValueNeeded事件觸發有兩個條件:
1、datagridview的VirtualMode屬性要設置為true。
2、datagridview的CellValueNeeded事件要觸發必須datagridview的列是非綁定列(即不能設置datagridview的DataPropertyName屬性),並且這個列必須可見
===============================================================================
方法使用事例
private void dgvRequisitionDetail_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) { if (e.RowIndex < 0) return; DataView dv = (DataView)dgvRequisitionDetail.DataSource; if (dv == null) return; // RequisitionStatus:請領單狀態:0 待審核,1已通過,2未通過,3,已完成(已出庫) if (e.ColumnIndex == CStatus.Index) { int status = DbHelper.GetInt(dv[e.RowIndex], "status"); if ((status == (int)RequisitionStatus.TO_AUDIT)) e.Value = CConst.SetRequisitionStatus(RequisitionStatus.TO_AUDIT); if ((status == (int)RequisitionStatus.NOTPASS)) e.Value = CConst.SetRequisitionStatus(RequisitionStatus.NOTPASS); if ((status == (int)RequisitionStatus.FINISHED)) e.Value = CConst.SetRequisitionStatus(RequisitionStatus.FINISHED); if ((status == (int)RequisitionStatus.AUDITED)) e.Value = CConst.SetRequisitionStatus(RequisitionStatus.AUDITED); int flag = DbHelper.GetInt(dv[e.RowIndex], "flag"); if (flag == (int)StockNumAndRequisitionNumEnum.STOCKNUM_LACK)//庫存數量<請領數量 { dgvRequisitionDetail.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Tomato; } if (flag == (int)StockNumAndRequisitionNumEnum.STOCKNUM_ENOUGH)//庫存數量>=請領數量 { dgvRequisitionDetail.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightGreen; } } }
效果圖