可恶的验证

来源:互联网 发布:淘宝登录用户名怎么改 编辑:程序博客网 时间:2024/05/16 14:25

如果你为一个窗体加入了DataGridView控件,并且允许用户修改Cell里的值,也许你会遇到和我一样的问题。

每次修改值之后,都应当对其数据进行验证,由于屏蔽了DataGridView的错误提示(那个太恶心了),验证的代码只好自己写。

采用普遍的方法,即编写CellValidating响应,这个事件会在每一次焦点从单元格上离开时被触发(而不是更改后,但你又不得不使用它,因为与CellEndEdit相比,其EventArg参数中含有Cancel属性,可以轻松取消此次更改)……为什么我会为此而闹心呢?

因为:

  1. 在验证的代码中,需要判断(如果被验证的单元格属于主键列)其值是否唯一,如果重复则退出更改;
  2. 甚至(当然)向DataGridView添加行的过程,也会引发验证。

这么一来,当用户向表单中添加一个新行后,焦点从这一行离开时验证代码会发现这个新行的第一个单元格与这个新行的主键值相同(这个行在被验证的时候已经是表的成员,所以会在验证中被查询到),最后拒绝向表中添加刚刚添加的行……

从而会引发一个异常。

事实上,每次窗体加载时,(如果事先定义了数据源)都会有DataGridView添加行的过程,也都会引发这个异常。

处理的方法就是笨拙地设立标记(我总是觉得标记是程序结构不佳的后果),使验证只在某个单元格的值发生改变时才进行。

原本我想把这个标记定义为bool,然后在CellValueChanged中修改,结果发现CellValueChanged和CellEndEdit事件都在CellValidating之后~~

于是最终我选择在CellEnter事件中保存单元格的原有值,而在CellValidating中与现有值比较的方法,判断是否要进行验证。

由于(在前面说过)CellValidating在每次单元格失去焦点时发生,那保存原有值也应当对应地发生在每次单元格获得焦点的时候。

不知道是不是多虑了,我对这样被频繁调用的代码很是反感……完了

reload note: 2010-05-18 http://blog.renren.com/blog/bp/Qm0idCtmGl