如何更好地对DataGridView控件进行数据验证

前言

DataGridView控件是Windows桌面编程中常用的一个数据控件,因其功能强大,显示效果好,而得到广泛的使用。由于DataGridView的数据显示是二维的,所以行列一多,会有大量的数据。因为,对于这些数据的格式和内容验证成为非常重要的内容。同时由于其数据量大,所以验证的方式与一般验证不同,所以本文就来谈谈DataGridView的验证原则。

在DataGridView中使用弹出式报错的问题

受到传统控件编程的思维定式影响,很多程序员在写DataGridView的数据验证的时候,使用的是对话框式的弹出报错。报错后,再返回原控件进行编辑操作。这种方式对于使用DataGridView来说,有以下几个问题:

  • 可能报错过多
    这是由于DataGridView的数据量决定的。一般的数据编辑控件一般只有1个数据,而DataGridView的数据量由行乘列决定,可能有成千上万个数据。如果中间有一小部分出错,那么要弹出一堆错误提示。
  • 报错后不易返回
    单一数据的控件弹出报错后,直接返回即可;而DataGridView,还要定位到具体的单元格。由于DataGridView的内部机制,在点击回国后会自动移动,所以给定位带来麻烦(当然也是可以解决的,请参考文章解决DataGridView回车后自动下移一行的问题)。
  • 无法批量

核心原则:内置报错而不是弹出式

在解释内置报错之前,首先要明白报错的核心目标是什么?显然,报错的核心任务是要告之用户数据出现了问题。它要满足两点要求:

  • 易见性:让用户能够清楚地看到有错误发生。
  • 信息性:告诉用户的错误类型,这样用户才能够进行相应的解决。

使用弹出式报错固然可惜满足以上条件,但是确认后消息就消失了,而且只对一个数据,显然是不符合DataGridView控件的需求的。因此,在DataGridView中,应该使用内置式,以红色感叹号为标记的报错,同时鼠标移去上去可以看到错误信息是更好的方式。以下示例是一个标准的DataGridView的报错用法。
在这里插入图片描述

内置报警实现方式

DataGridView控件中验证数据验证涉及到单元的一个属性:ErrorText,即错误信息。只要在进行数据验证后,如果某单元格的值不符合要求,则设置其 ErrorText 的内容为错误提示信息,然后红色的感叹号就会显示出来。注意:如果数据修改后正常,则需要将其值设置为 nullString.Empty,从而消除红色感叹号。

检测方式

每个单元格的检测,可以利用DataGridView控件的 CellValidating 和 CellEndEdit 这两个事件来完成,这两个事件都会在完成编辑后得到执行。区别在于 CellValidating 的事件参数System.Windows.Forms.DataGridViewCellValidatingEventArgs类有个 Cancel 属性,在事件中可以设置为 true,从而让用户焦点锁定在当前单元格,在验证成功前,不能退出单元格。

以下代码演示了使用此事件进行验证的过程。

private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
    if (e.ColumnIndex == 0) // 对第0列进行验证
    {
        // 判断当前单元格的值是否为float型
        if (!float.TryParse(e.FormattedValue.ToString(), out float r))     
        {
            // 验证失败则显示红色感叹号,并在鼠标移动上去时显示错误信息:"请输入数值类型的数据"
            dataGridView1.Rows[e.RowIndex].ErrorText = "请输入数值类型的数据";  
            e.Cancel = true; // 锁定当前单元格,通过验证前不能离开
        }
    }
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值