后来在csdn上问了一下,才知道这是Visual Studio.net 2003的著名Bug(好像听说Visual Studio.net 2005中修复了这个bug,不知道真的假的)。这个Bug的重现方法是:你在前台代码中拖进一个控件,然后双击它产生一个简单的事件(一般是click事件)。然后你到“InitializeComponent”函数中看看事件绑定代码在不在。这是如果正常的话,绑定代码应该还在。接着,你剪切(ctrl+x)这个控件,然后复制(ctrl+v)到你想放的页面上其他的一些位置。这时,你再到“InitializeComponent”函数中去看那个事件绑定代码,不出意外,这段代码已经不在了。
这个bug的逻辑其实很简单。你想想,当你把一个控件删除之后,它在“InitializeComponent”函数中的初始化代码和事件绑定代码肯定也被去掉了。但你可以看到,那个事件处理函数(比如button_click)应该还安静地躺在后面的代码里。其实删除控件与剪切控件是,Visual Studio.net 2003做的是同样的一件事情。但是当你把那个你剪切的控件重新由复制到页面上,其实这个与拖一个新的控件到页面上是没有任何区别的。这就很容易明白为什么事件绑定代码没有出现,因为Visual Studio.net 2003当你是新建一个控件罢了。
这确实是个恼人的bug,特别当你页面数量很多时,要你一个一个的检查,简直是无法忍受的。这里提供几个方法解决的方法可供参考:
1.当第一次拖入控件时,Visual Studio.net 2003在“InitializeComponent”函数中为你创建了相关事件绑定代码之后,想办法把这些代码移出“InitializeComponent”函数,因为Visual Studio.net 2003的“Windows Form Designer generated code”功能只会修改“InitializeComponent”函数中的代码。移出的方法很多,可以放在“onInit”函数中,或者另写一个函数放置。
2.如果你做了剪切操作之后,请记得重新绑定它的事件代码。这是请不要双击这个控件,而是到事件标签中选择对应事件的下拉框,你会看看你剪切前就写好的那个事件处理代码。
3.如果你还是不放心你的大量页面中是不是由事件没有做绑定,你可以试试下面的这个工具(转载自http://kb.csdn.net/.net/Articles/200512/a448b858-1521-4cc8-a4ae-897f50f6b591.html)。它是在事后对所有.cs文件中的事件处理函数找其相应的绑定。使用这个代码有一个局限,就是对于那些不喜欢删除不再使用的事件处理函数的人来说,这个工具就意义不大了。
下面贴一下这个工具的检查绑定的代码