ASP.net中动态加载控件时一些问题的总结

翻译|其它|编辑:郝浩|2007-10-26 11:55:51.000|阅读 724 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

经常见到有人说在 ASP.net 中不要使用动态控件,我想主要的原因在于使用动态控件会带来一些问题,在做项目的过程中,我将由动态加载控件引发的总是作了一个小小的总结.


1 、在使用 LoadControl 加载控件后,用户控件中的某些控件不再响应事件。
    这个问题主要是由于将控件加载放在if (!Page.IsPostBack)之内引起的,放在外面即可。在思归的 blog上对此问题进行了详细的说明。
2、用户控件中某些控件的响应出现问题,如某个按钮第一次选择时不触发 CLICK 事件,第二次可以了。
    这是由于没有给控件设置 ID 引起的,控件 ID 的作用在下面详细讲述。 如 
   Control  userControl=(Control)Page.LoadControl(“Test.ascx”);
   userControl.ID=“Test”;
   AddControl(userControl);
3、如果用户控件中包括 DataGrid 控件,那么加载控件后可能出现不响应 DataGrid 事件的问题。
   这好像是一个 bug,必须要将加载的控件进行强制转换,如:
   Test userControl=(Test)Page.LoadControl(“Test.ascx”);  
   注意:上面使用的是Test类型,而不是Control!
   我在以前的 Blog 中曾提到过这个问题,这种方式将使系统的扩展性降低。 我有一个解决方案可以和大家讨论(运用策略模式):
   public class BaseControl : System.Web.UI.UserControl
  {
          public virtual BaseControl  ProcessThisControl();
          
  }
所有的用户控件从 BaseControl  继承,如果有 Datagrid 控件,由overide ProcessThisControl方法 ,如:
          return this as Test;
 按如下方式加载控件:
    BaseControl  userControl=(BaseControl  )Page.LoadControl(“Test.ascx”);  
   userControl.ProcessThisControl();
 
4、在用户控件中如何使用 JavaScript。
    大家都知道,使用客户端的脚本将大大提高页面的响应速度,同时可以避免频繁地刷新页面。所以使用 javascript 来实现页面中部分控制是一个比较好的方式,但是在用户控件中如果访问某一个子控件呢?

使用方式如下:  document.all.<%= TestControl.ClientID%>.disabled=true;     //将 TestControl设置为不可用
如果在C#脚本中应该这样写:Page.RegisterStartupScript("OnInitControl","<SCRIPT LANGUAGE='JavaScript'>document.all.Test_TestControl.disabled=true;</SCRIPT>");   //Test为用户控件,TestControl 为用户控件中的子控件。

现在说一下控件 ID,在访问 aspx 文件时,IIS 会将 aspx 的脚本进行编译。编译的时候将用户控件中的内容写在同一个页面中,为了防止页面中的控件与用户控件中的控件名称相同,在编译的时候对用户控件中的控件名称修改为 :   用户控件名:子控件 ,控件 ID 则修改为 用户控件 ID_子控件 ID。 在动态加载控件时,如果不对控件的 ID 进行赋值,则控件 ID 为上一次加载的控件 ID,因此在加载用户控件后应该立即对其设置 ID。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:csdn

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP