asp.net控件加载:asp.net动态加载自定义控件

发布时间:2020-11-06编辑:脚本学堂
有关asp.net控件加载的方法,asp.net动态加载自定义控件的例子,asp.net动态加载用户自定义控件,然后转换成html代码。

asp.net动态加载自定义控件方法总结

一、asp.net动态加载自定义控件:

复制代码 代码示例:
//usercontrol.IndexOper为自定义控件
usercontrol.IndexOper uc=(usercontrol.IndexOper)Page.LoadControl("自定义控件路径");
uc.ID = "uc";  //定义唯一标示
//OperContent为PlaceHolder控件
OperContent.Controls.Add(uc);

二、asp.net动态加载用户控件

动态加载用户控件的方法

第一步:将用户控件放在mylist.ascx,然后其control指令是:
 

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ViewComment.ascx.cs" Inherits="Control_ViewComment"%>

这时已有了Inherits,自带了ClassName名称,如果没有,则必须创建ClassName属性。
假设其有公共属性ID。

第二步:在某一个aspx文件需要动态加载,首先使用:
 

<%@ Reference Control="MyList.Ascx" %>
<%@ Page Language="C#" CodeFile="GetAscx.aspx.cs" Inherits="AdEntity_GetAscx" %>

引用,这时候在代码页GetAscx.aspx.cs可以动态加载ASCX控件了:
 

Control_ViewComment ctrl = (Control_ViewComment)Page.LoadControl("~/Control/ViewComment.ascx");
ctrl.ID = Request["AdentityId"];
base.Controls.Add(ctrl);

最简单方式:
 

<%@ Register Assembly="Business" Namespace="Business" TagPrefix="My" %>

三、asp.net动态加载用户自定义控件,然后转换成html代码

ajax无刷新重载页面。

在asp.net中创建用户自定义控件,通过ajax请求返回用户自定义控件html代码。

例子:
 

复制代码 代码示例:
public static string RangerUsControl(string controlName)
{
StringBuilder build = new StringBuilder();
HtmlTextWriter htmlWriter = new HtmlTextWriter(new StringWriter(build));
UserControl uc = new UserControl();
Control ctrl=uc.LoadControl(controlName+".ascx");//加载用户定义控件 TextBox txtBox1 = ctrl.FindControl("TextBox1") as TextBox;//获得id为“TextBox1”的控件
txtBox1.Text = "测试"; //给控件初始化 string result;
try
{
ctrl.RenderControl(htmlWriter);
}
catch { }
finally
{
htmlWriter.Flush();
result=build.ToString();
}
return result;//返回控件的HTML代码
}
htmlWriter.Flush();

附,asp.net 动态加载控件时一些问题的总结。

由动态加载控件引发的一些问题及总结。

1 、在使用LoadControl加载控件后,用户控件中的某些控件不再响应事件。

此问题是由于将控件加载放在if (!Page.IsPostBack)之内引起的,放在外面即可。

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!

这种方式将使系统的扩展性降低。

运用策略模式:
 

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。