欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-11 20:44:01
1 、在使用loadcontrol加载控件后,用户控件中的某些控件不再响应事件。 这个问题主要是由于将控件加载放在if (!page.ispostback)之内引起的,放在...

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.