如果是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事件,输入的内容无法保存到单元格中和数据源中。特殊的验证(比如长度、格式等)还是需要另外写代码实现。
关于增加行的问题。增加新行时多主键的验证有问题,而且验证不通过时会将新行全部删除。限制很多,很不方便。
 
非绑定的优势:验证等处理比较灵活。不受数据源的约束。
非绑定得缺点:显示和向数据库更新数据时需要比较多的代码实现,效率比较低。
 
总的感觉在处理验证比较麻烦的场合,我还是比较喜欢非绑定的方式。如果数据量大,验证比较简单的场合使用绑定模式比较好 

转载于:https://www.cnblogs.com/greatverve/archive/2012/06/14/DataGridView-CellValidating.html

DataGridView数据验证CellValidating()相关推荐

  1. 数据验证html,JavaScript 表单数据验证

    JavaScript 表单 HTML 表单验证可以通过 JavaScript 来完成. HTML 表单验证也可以通过浏览器来自动完成. 如果表单字段 (fname) 的值为空, required 属性 ...

  2. java中mypoiexception,java - 如何使用Poi获取Java中单元格的数据验证源? - 堆栈内存溢出...

    此问题包含多个不同的问题. 首先,我们需要获取工作表的数据验证,然后为每个数据验证获取数据验证所适用的Excel单元格范围. 如果该单元格位于该单元格范围之一中,并且数据验证是列表约束,则进行进一步处 ...

  3. ExtJs 备忘录(3)—— Form表单(三) [ 数据验证 ]

    正文 一.资料 1.1. 表单提示的方式设置,如: Ext.form.Field.prototype.msgTarget='side' 该设置为枚举值:'qtip','side','title','u ...

  4. Silverlight实例教程 - Validation数据验证开篇

    Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...

  5. 基于jquery,bootstrap数据验证插件bootstrapValidator 教程

    ootstrap:能够增加兼容性的强大框架. 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说. 需要引用css: bootstrap.min.cs ...

  6. 《Excel 职场手册:260招菜鸟变达人》一第 14 招 利用数据验证记录数据录入时间...

    本节书摘来异步社区<Excel 职场手册:260招菜鸟变达人>一书中的第1章,第14节,作者: 聂春霞 , 佛山小老鼠 责编: 王峰松,更多章节内容可以访问云栖社区"异步社区&q ...

  7. WEB应用数据验证指南

    WEB应用数据验证指南 1.为什么要验证数据? 如果不验证数据,容易导致WEB应用出现多种漏洞,比如:SQL注入攻击,命令注入攻击,跨站点脚本攻击,编码攻击,文件系统攻击和缓冲区溢出.因此,为了保护W ...

  8. day22-Model数据验证以及钩子

    一.前言 其实在django内部也是支持数据验证的,只是这个数据验证比较弱而已,只能支持单个的验证,但是对于组合的,或者固定的,我们就验证不了,你说可以验证邮箱格式,但是不能验证 不能@qq.com结 ...

  9. Silverlight – Datagrid,Dataform数据验证和ValidationSummary

    上一篇,我们讨论了,捕获用户提交数据验证.本篇将集中讨论Datagrid和Dataform两个数据控件的数据验证方法,其中,我们会附加介绍一个新的验证控件ValidationSummary. 概述 D ...

最新文章

  1. Element 2.6.0 发布,基于 Vue 2.0 的桌面端组件库
  2. 校园二手交易平台的开发和利用
  3. OSX 挂载 NTFS 格式硬盘
  4. QML 界面切换的几种方法
  5. Dreamoon Likes Coloring CodeForces - 1330C(贪心+思维)
  6. 在html中怎么写加起来的,css可以在html里面写吗?
  7. 不同浏览器对回车提交表单的处理办法(转载)
  8. 使用Flash Builder 4.5进行多平台游戏开发
  9. 软件工程实验报告:图书管理系统
  10. Xshell7免费版申请无需破解
  11. 【开篇】初等数论及其核心内容
  12. 02、RS485 通信与 Modbus 协议
  13. excel常用函数公式及技巧搜集4
  14. html如何让英文自动换行,HTML如何让英文自动换行不断词
  15. php apache mpm,RHEL 7 Apache MPM 配置
  16. 基于Python(Django)+MongoDB实现的(Web)新闻采集和订阅系统【100010319】
  17. 发送端口25,465,587端口
  18. 通过跳绳瘦下来是一种怎么样的体验?
  19. fuchsiaos和鸿蒙os区别,谷歌Fuchsia OS和华为鸿蒙系统(HarmonyOS)没有必然联系
  20. java 随机数生成算法_java 语言实现的随机数生成算法

热门文章

  1. context root修改无效:web修改项目路径(eclipse)
  2. C语言 | C语言实现日历打印
  3. SQLite学习手册(索引和数据分析/清理)
  4. oracle存储照片,[oracle]中存储图片
  5. linux pci 寄存器,Linux 内核 标准 PCI 配置寄存器
  6. es dsl java api_求帮助将dsl翻译为java的API
  7. 第四范式入围Forrester Wave™:预测分析与机器学习中国市场评测报告 位列领导者行列...
  8. vb.net2019-打开外部程序发送键盘信号(4)
  9. mxnet基础到提高(53)-ndarray与numpy之间转换
  10. 【CV】基于聚类的图像分割-Python