前言
DataGridView控件是Windows桌面编程中常用的一个数据控件,因其功能强大,显示效果好,而得到广泛的使用。由于DataGridView的数据显示是二维的,所以行列一多,会有大量的数据。因为,对于这些数据的格式和内容验证成为非常重要的内容。同时由于其数据量大,所以验证的方式与一般验证不同,所以本文就来谈谈DataGridView的验证原则。
在DataGridView中使用弹出式报错的问题
受到传统控件编程的思维定式影响,很多程序员在写DataGridView的数据验证的时候,使用的是对话框式的弹出报错。报错后,再返回原控件进行编辑操作。这种方式对于使用DataGridView来说,有以下几个问题:
- 可能报错过多
这是由于DataGridView的数据量决定的。一般的数据编辑控件一般只有1个数据,而DataGridView的数据量由行乘列决定,可能有成千上万个数据。如果中间有一小部分出错,那么要弹出一堆错误提示。 - 报错后不易返回
单一数据的控件弹出报错后,直接返回即可;而DataGridView,还要定位到具体的单元格。由于DataGridView的内部机制,在点击回国后会自动移动,所以给定位带来麻烦(当然也是可以解决的,请参考文章解决DataGridView回车后自动下移一行的问题)。 - 无法批量
核心原则:内置报错而不是弹出式
在解释内置报错之前,首先要明白报错的核心目标是什么?显然,报错的核心任务是要告之用户数据出现了问题。它要满足两点要求:
- 易见性:让用户能够清楚地看到有错误发生。
- 信息性:告诉用户的错误类型,这样用户才能够进行相应的解决。
使用弹出式报错固然可惜满足以上条件,但是确认后消息就消失了,而且只对一个数据,显然是不符合DataGridView控件的需求的。因此,在DataGridView中,应该使用内置式,以红色感叹号为标记的报错,同时鼠标移去上去可以看到错误信息是更好的方式。以下示例是一个标准的DataGridView的报错用法。
内置报警实现方式
DataGridView控件中验证数据验证涉及到单元的一个属性:ErrorText,即错误信息。只要在进行数据验证后,如果某单元格的值不符合要求,则设置其 ErrorText 的内容为错误提示信息,然后红色的感叹号就会显示出来。注意:如果数据修改后正常,则需要将其值设置为 null
或 String.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; // 锁定当前单元格,通过验证前不能离开
}
}
}