随笔 - 53, 文章 - 0, 评论 - 491, 引用 - 12
数据加载中……

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

经常见到有人说在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%><%= lstUser.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。




0
0
(请您对文章做出评价)
« 上一篇:ASP.net中 动态加载控件后控件定位的问题
» 下一篇:NHibernate中多表(对象)间的查询

posted on 2004-06-14 15:26 wljcan 阅读(7673) 评论(11)  编辑 收藏

评论

#1楼   回复  引用    

我在頁面中添加一個ascx,當我在頁面中點擊一個button後我想執行這個ascx中的一個方法,這個方法會改變ascx中的值,該怎樣做呢
2004-06-15 09:11 | Young

#2楼   回复  引用    

可以这样做,将ascx中的方法定义成 public,然后在page中调用,如:

ascx文件中定义控件:
public class TestControl :System.Web.UI.UserControl
{
public void YourMethod() //你需要调用的方法
{
}
}

页面中:

private TestControl testControl;

加载控件:
testControl=(TestControl)LoadControl("TestControl.ascx");
PlaceHolder1.Controls.Add(testControl);

在button中调用:

testControl.YourMethod();

2004-06-15 09:55 | wljcan

#3楼   回复  引用    

我有一个SearchForm.ascx,将其放在主页Default.aspx里可用,但放在其他页面SearchForm.ascs中的按钮就不工作,怎么点都没反应,难道要用LoadControl?为什么在主页又可用?
2005-02-25 18:10 | san

#4楼   回复  引用    

wewe
2005-04-13 09:44 | twq[未注册用户]

#5楼   回复  引用    

谢谢,学习
2006-04-05 15:54 | laoyu[未注册用户]

#6楼   回复  引用    

@wljcan
好像不行啊。刚试过。
2006-09-02 16:20 | 12[未注册用户]

#7楼   回复  引用    

可以了,是我把方法定义为静态了。
2006-09-02 16:24 | 12[未注册用户]

#8楼   回复  引用    

有时我编译后的控件ID中有"{}",这种是怎么回事,怎么解决呢,谢谢了!!!
2006-09-13 20:32 | Bzlj[未注册用户]

#9楼   回复  引用    

非常好
2006-11-29 11:02 | 悠悠春竹[未注册用户]

#10楼   回复  引用    

我平时也喜欢在设计架构上稍微深入一点,我的MSN:mazk_good@hotmail.com

希望各位爱好者,并有一定基础的人交流一下!那样大家在学习开发项目中
互相帮忙能提高效率。
2006-11-29 11:10 | 悠悠春竹[未注册用户]

#11楼   回复  引用  查看    

非常感谢 解决了
2008-01-16 14:04 | 唐俊