sjpisaboy

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
        最近做ASP.NET的项目,突然发现刚才还好好的控件,在我对.aspx修改之后,竟然不能正常运行了。比如说一个简单的button控件,原先有一个button_click事件与之绑定。但在我稍微改了改前台页面的美工之后,它的button_click事件就失效了。后来到那个著名的“Windows Form Designer generated code”,即“InitializeComponent”函数中去看了看,竟然发现事件绑定的代码没了。

        后来在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文件中的事件处理函数找其相应的绑定。使用这个代码有一个局限,就是对于那些不喜欢删除不再使用的事件处理函数的人来说,这个工具就意义不大了。

下面贴一下这个工具的检查绑定的代码
private ArrayList FindLost()
        
{
            Regex objRegex ;
            Regex objRegex0 ;
            Match objMatch ;
            Match objMatch0 ;
            ArrayList result 
= new ArrayList();
            
string content = string.Empty;
            
string functionName = string.Empty;
            
bool flag = rb0.Checked;
            
foreach(string f in FileListResult)
            
{                
                
using (StreamReader objStreamReader = new StreamReader(f)) 
                
{
                    
if((content=objStreamReader.ReadToEnd())!=null)
                    
{
                        objRegex 
= new Regex("private[\\s]+void[\\s]+(?<FunctionName>\\w+)\\(object[\\s]+(?<senderName>\\w+),[\\s]+(?<EventArgsPrefix>[A-Za-z0-9_\\.]*)EventArgs[\\s]+(?<EventArgsName>\\w+)\\)", RegexOptions.IgnoreCase);
                        objMatch 
= objRegex.Match(content);
                        
while(objMatch.Success)
                        
{
                            functionName 
= objMatch.Result("${FunctionName}");
                            objRegex0 
= new Regex("\\((?<senderName>[this\\.]*)"+functionName+"\\)");
                            objMatch0 
= objRegex0.Match(content);
                            
if(!objMatch0.Success)
                            
{
                                
if(flag)
                                
{
                                    result.Add(
string.Format("{0},丢失事件:{1}",f.Replace(txtPath.Text,""),functionName));
                                }

                                
else
                                
{
                                    result.Add(
string.Format("{0},丢失事件:{1}",f,functionName));
                                }

                            }

                            objMatch
=objMatch.NextMatch();
                        }

                    }

                }

                finishFileNum
++;
            }

            
return result;
        }
posted on 2006-04-06 15:39  Brendan  阅读(1150)  评论(0编辑  收藏  举报