您的位置:首页 > 编程语言 > ASP

ASP.NET控件事件丢失的探究

2006-04-06 15:39 211 查看
最近做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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐