zoukankan      html  css  js  c++  java
  • DataGridView中虚拟模式(Virtual Mode)用法

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

  • 相关阅读:
    希望走过的路成为未来的基石
    第三次个人作业--用例图设计
    第二次结对作业
    第一次结对作业
    第二次个人编程作业
    第一次个人编程作业(更新至2020.02.07)
    Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro权限
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    spring cloud springboot 框架源码 activiti工作流 前后分离 集成代码生成器
    java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码
  • 原文地址:https://www.cnblogs.com/scottckt/p/1961471.html
Copyright © 2011-2022 走看看