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

    判断退格。
  • 相关阅读:
    Delphi操作ACCESS技巧集
    Delphi ADOQuery
    Delphi 与SQL编程
    delphi Sqlite
    Delphi 2010下使用sqlitesimpledelphi连接SQLite数据库及中文乱码问题的解决
    Java并发指南13:Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析
    Java并发指南12:深度解读 java 线程池设计思想及源码实现
    Java并发指南11:解读 Java 阻塞队列 BlockingQueue
    Java并发指南10:Java 读写锁 ReentrantReadWriteLock 源码分析
    Java并发指南9:AQS共享模式与并发工具类的实现
  • 原文地址:https://www.cnblogs.com/blsong/p/2575608.html
Copyright © 2011-2022 走看看