大家好,我是陆砚码。在ASP.NET的开发过程中,动态加载控件是个常用的技巧,但也有很多坑等着我们。今天就来和大家聊聊,那些年我们在动态加载控件时遇到的坑,以及如何优雅地绕过它们。
常见问题一:事件响应问题
有时候,我们在使用LoadControl加载控件后,会发现用户控件中的某些控件不再响应事件。这是因为我们将控件加载放在了if (!Page.IsPostBack)之内,其实应该放在外面。具体可以参考思归的blog上的详细说明。
常见问题二:控件ID未设置
用户控件中某些控件的响应出现问题,比如某个按钮第一次选择时不触发CLICK事件,第二次可以了。这是因为没有给控件设置ID。控件ID的作用非常重要,下面我会详细讲解。
Control userControl=(Control)Page.LoadControl(“Test.ascx”);
userControl.ID=“Test”;
AddControl(userControl);
常见问题三:DataGrid事件响应问题
如果用户控件中包括DataGrid控件,加载控件后可能出现不响应DataGrid事件的问题。这好像是一个bug,需要将加载的控件进行强制转换。但这种方式会降低系统的扩展性。我有一个解决方案可以和大家讨论,就是运用策略模式。
public class BaseControl : System.Web.UI.UserControl{
public virtual BaseControl ProcessThisControl();
}
所有的用户控件从BaseControl 继承,如果有Datagrid控件,由overide ProcessThisControl方法 ,如:
return this as Test;
如何使用JavaScript
使用客户端的脚本可以大大提高页面的响应速度,同时可以避免频繁地刷新页面。在用户控件中访问某一个子控件,可以使用以下方式:
document.all.TestControl.disabled=true;
在C#脚本中,可以这样写:
Page.RegisterStartupScript(
