当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.net 动态加载控件时一些问题的总结

ASP.NET
ASP.Net分页控件源码
Community Server专题一:概述Community Server
Community Server专题三:HttpModule
relaxlife.net发布一个自己开发的中文分词程序
RLCSS分词系统更新下载
asp.net获取SQL所有数据库名、所有表名、所有字段名
asp.net下获取Excel所有的工作表名称
Asp.Net常用函数
asp.net下用url重写URLReWriter实现任意二级域名的方法
在.NET中利用XMLHTTP下载文件的代码
在ASP.NET 中实现单点登录
c# .net 生成图片验证码的代码
asp.net中MD5 16位和32位加密函数
自己常用到的自定义公共类(已测试通过)
ASP.NET 2.0下随机读取Access记录的实现方法
.NET(C#)连接各类数据库代码-集锦
nunit使用指南之—NUnit Quick Start
ASP.NET中读取XML文件信息的4种方法与示例代码
asp.net中获取远程网页的内容之一(downmoon原创)
asp.net下获取远程网页的内容之二(downmoon原创)

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 67 ::
收藏到网摘: n/a

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