zoukankan      html  css  js  c++  java
  • DataGridView数据验证CellValidating() (转)

    http://www.cnblogs.com/greatverve/archive/2012/06/14/DataGridView-CellValidating.html

    如果是TextBox可以通过KeyPress()事件,让用户无法输入非法数据。
    DataGridView中的单元格,无法通过KeyPress()控制,可能我没找到方法。
    通过CellValidating()在用户结束编辑时判断,如果不合法则还原数据。

    复制代码
    private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        //可编辑的列
        if (e.ColumnIndex != 2 && e.ColumnIndex != 3)
            return;
        double outDb = 0;
        if (double.TryParse(e.FormattedValue.ToString(), out outDb))
        {
            e.Cancel = false;
        }
        else
        {
            e.Cancel = true;//数据格式不正确则还原
            dataGridView1.CancelEdit();
        }
    }
    复制代码
    TextBox的KeyPress()事件
    复制代码
    private void txtK_KeyPress(object sender, KeyPressEventArgs e)
    {
        double outDb = 0;
        if (double.TryParse(txtK.Text + e.KeyChar.ToString(), out outDb))
        {
            e.Handled = false;
        }
        else
        {
            e.Handled = true;
        }
    }
    复制代码
    我继承TextBox重写KeyPress()封装了个自定义控件。
    url:http://greatverve.cnblogs.com/archive/2012/06/14/DataGridView-CellValidating.html
    定义单元格验证
    要求:
    验证错误后焦点不离开。
    实现:
    单元格的验证可以使用dgv_details_CellValidating事件。
    验证不通过时调用e.Cancel = true;终止事件链,单元格将保持编辑状态。
    调用dgv_details.CancelEdit();可以使单元格的内容会滚到修改前的值。
    使用System.Windows.Forms.SendKeys.Send("^a");将全选单元格的内容。
     
    单元格选中并开始编辑状态
    实现:
    //DataGridView获得焦点
    dgv_details.Focus();
    //DataGridView指定当前单元格
    dgv_details.CurrentCell = dgv_details[0, 0];
    //开始编辑状态
    dgv_details.BeginEdit(false);
     
    定制自动生成绑定了列
    实现:
    dgv_details.AutoGenerateColumns = false;
     
    设置列的背景色
    实现:
    Color GridReadOnlyColor = Color.LightGoldenrodYellow;
    dgv_details.Columns[1].DefaultCellStyle.BackColor =
    WinKeys.GridReadOnlyColor;
     
    DataGridView单元格验证的设计的问题
    问题一:绑定还是不绑定?
    绑定的优势:比较简单,代码少。
    绑定得缺点:DataGridView中的数据受数据源的影响(主键约束、值类型约束)。不一至时会激发DataError事件,输入的内容无法保存到单元格中和数据源中。特殊的验证(比如长度、格式等)还是需要另外写代码实现。
    关于增加行的问题。增加新行时多主键的验证有问题,而且验证不通过时会将新行全部删除。限制很多,很不方便。
     
    非绑定的优势:验证等处理比较灵活。不受数据源的约束。
    非绑定得缺点:显示和向数据库更新数据时需要比较多的代码实现,效率比较低。
     
    总的感觉在处理验证比较麻烦的场合,我还是比较喜欢非绑定的方式。如果数据量大,验证比较简单的场合使用绑定模式比较好 

    凡事以大气象去面对,优秀是一种习惯。

    « 博主前一篇:c#枚举(Enum)的用法及遍历方法
    » 博主后一篇:上班族的坐姿
    #1楼[楼主] 2012-06-14 14:42 | 大气象  
    1
    2
    3
    4
    if (e.KeyChar == (char)Keys.Back)
       {
          return;
       }

    判断退格。
  • 相关阅读:
    解决:Could not resolve archetype org.apache.maven.archetypes
    Spring MVC配置MyBatis输出SQL
    Spring集成MyBatis 通用Mapper以及 pagehelper分页插件
    关于SpringMVC或Struts2接受参数接收不到的原因
    配置quartz启动时就执行一次
    ajaxFileUpload进行文件上传时,总是进入error
    spring mvc注入配置文件里的属性
    java中将一个文件夹下所有的文件压缩成一个文件
    flume failed to start agent because dependencies were not found in classpath
    ubuntu不能安装pip unable to install pip in unbuntu
  • 原文地址:https://www.cnblogs.com/blsong/p/2575608.html
Copyright © 2011-2022 走看看