winform DataGridView的虛模式填充,CellValueNeeded事件的觸發條件


虛模式填充常用來處理大量數據,某個字段的顯示問題。

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;
                }
            }
        }

效果圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM