今天编程时,发现了一个关于CausesValidation与Validating事件引发的小问题.
在主窗体中拖放一个Textbox控件,名为tbx.拖放一个FlowLayoutPanel控件到主窗体,名为flowLayoutPanel.一个Button控件,名为btn1.将btn1拖放到flowLayoutPanel中.然后作如下设置:
tbx.CausesValidation=true;
btn1.CausesValidation=false;
然后设置tbx的Validating事件:










在MSDN中有一段很明确地说明:
如果 CausesValidation 属性设置为 false,则将取消 Validating 和 Validated 事件。对于诸如“帮助”按钮之类的控件而言,CausesValidation 属性值通常设置为 false。
按常理,也就是说,如果tbx获得了焦点,然后输入的内容为空之后,点击btn1是应该不会引发tbx_Validating方法的.因为btn1.CausesValidation=false;但实际运行程序,还是会引发tbx_Validating,(不信你自己试试看!).难道MSDN出错了?
会不会问题出在tbx与btn1不在同一级容器中呢?
1.首先试着将两者都放在flowLayoutPanel中,再次执行程序,发现这次并没有引发tbx_Validating事件.看来还真是这个原因.
2.将两者都放在主窗体中,也没有引发tbx_Validating事件.
3.将tbx放在主窗体中,btn1放在flowLayoutPanel中,引发了tbx_Validating事件.
4.将btn1放在主窗体中,tbx放在flowLayoutPanel中,没有引发tbx_Validating事件.
看来,只有第3种情况是不符合"常理"的.我想细心的读者不难发现,这里有一个容器级别的问题.综上所述,即当要被验证的控件(本例是tbx)所属的容器与其他控件(本例的btn1)所属容器相同,或者前者是后者的父容器时,不会违背"常理";只有反过来的一种情况才会出意外.这一点MSDN中没有明确说出.