在ASPNET页面中动态添加控件.docx
《在ASPNET页面中动态添加控件.docx》由会员分享,可在线阅读,更多相关《在ASPNET页面中动态添加控件.docx(11页珍藏版)》请在冰豆网上搜索。
在ASPNET页面中动态添加控件
在ASP.NET页面中动态添加控件
微软示例:
就像您可以通过编程方式在Web窗体页上创建任意ASP.NET服务器控件的实例,您也可以通过使用包含页的LoadControl方法来做到这一点。
但您首先必须使用@Control指令的className属性将强类型与用户控件相关联。
之所以需要这样是因为LoadControl方法返回Control类的类型,并且您需要将该用户控件转换为合适的强类型,以便设置该控件的各个属性。
以下代码使用className属性将MyUserControl.ascx文件中保存的用户控件转换为强类型。
<%@ControlclassName="MyUserControl"%>
以编程方式创建用户控件的实例
1.使用@Reference指令在要包含用户控件的Web窗体页的顶部注册该用户控件。
当以编程方式创建用户控件时,只有您创建了对该控件的引用后,用户控件的强类型才可用于该Web窗体页。
例如,以下代码创建对MyUserControl.ascx文件中所创建用户控件的引用。
<%@ReferenceControl="MyUserControl.ascx"%>
注意当以声明方式在Web窗体页中创建用户控件的实例时,请使用@Register指令。
2.在代码隐藏类文件中,或是在包含.aspx文件的代码声明块中,创建用户控件的实例。
根据需要分配属性值,并使用Add方法将该控件添加到包含页的ControlCollection对象上。
这使该控件可用于该页的继承的Control.Controls属性。
在以下示例中,创建MyUserControl.ascx的实例并将其BackColor属性设置为beige。
[C#]
Controlc1=LoadControl("MyUserControl.ascx");
((MyUserControl)c1).BackColor="beige";
Page.Controls.Add(c1);
[VisualBasic]
Dimc1AsUserControl=LoadControl("MyUserControl.ascx")
CType(c1,MyUserControl).BackColor="beige"
Page.Controls.Add(c1)
注意当您使用Add方法将控件添加到ControlCollection对象时,这些控件将按处理顺序放置在集合中。
如果您希望将控件添加到集合中的特定位置,请使用AddAt方法并指定您要存储该控件的索引位置。
地址:
ms-help:
//MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconinstantiatingusercontrolsprogrammatically.htm
鸿雪示例:
注:
本方法是我同事李强原创
步骤一:
把ascx控件拖入设计窗口,然后转入html模式,保留定义
如果你需要多个ascx的话,请全部拖入。
但是把相应的内容删除。
(因为我们需要动态加载)
在需要填入控件的地方,放个容器,比如td,并设定在服务器端运行
如
| 2:
动态调用
UserControlmyusercontrol=(UserControl)LoadControl("../includes/pageNavigater.ascx");
Typemyusertype=myusercontrol.GetType();
//下面是给ascx赋值
PropertyInfo myuserinfo1=myusertype.GetProperty("RelatedDatagrid");//).GetProperty("RelatedDatagrid");
myuserinfo1.SetValue(myusercontrol,gridhwcy ,null);
PropertyInfo mypassinfo=myusertype.GetProperty("torefresh");
mypassinfo.SetValue(myusercontrol,true,null);
PropertyInfo myuserdatasource=myusertype.GetProperty("RelatedDataSource");
myuserdatasource.SetValue(myusercontrol,dv,null);
tdpan.Controls.Clear();
tdpan.Controls.Add(myusercontrol);
动态加载用户控件,关于后台添加、修改的思考
一直以来,我都在思考,一些繁琐的操作,比如我们一般的管理后台,很多都是数据的添加、修改与删除,列表的操作,而且一般我们都是用.aspx文件去做的。
看下下面这个典型的后台(比较粗糙):
说实在,我很厌倦全部用.aspx文件去做,比如“友情连接”这个模块,就有“添加友情连接”“修改友情连接”“友情连接列表”,简单的话,可以把“添加”“修改”合成一个文件。
每次都去建立一个.aspx文件。
我现在的想法是用“用户控件+配置文件”去实现,虽然文件数目可能不会少很多。
但在编程到一定地步,我想大家会有跟我一样的想法。
首先需要涉及的是动态添加“用户控件”,这个可以根据传参来动态加载,代码如下:
protectedControlcontrol;
protectedvoidPage_Load(objectsender,EventArgse)
{
intid=Convert.ToInt32(Request.QueryString["id"]);
switch(id)
{
case0:
//不要加载用户控件
Response.Write("您没有加载任何控件");
break;
case1:
//加载用户控件
control=Page.LoadControl("~/login.ascx");
control.ID="uc1";//这里命名是为了可以取得里面控件的值
placeholder1.Controls.Add(control);
break;
default:
break;
}
}
而只需要用到一个.aspx文件,且这个文件中有个用户控件,代码如下:
placeholderrunat="server"ID="placeholder1">
placeholder>
如果这个“用户控件”中有一个ID为“tbxUserName”的TextBox,那么在.aspx文件中,要取得这个的值,代码如下:
((TextBox)placeholder1.FindControl("uc1").FindControl("tbxUserName")).Text
ASP.net中动态加载用户控件
UserControlcontrol=(_pager.LoadControl(String.Format("~/WebUC/{0}.ascx",_ctrlId)))asUserControl;
control.ID="uc_"+_ctrlId;
_panelControl.Controls.Add(control);
ASP.net中动态加载用户控件时一些问题的总结
经常见到有人说在ASP.net中不要使用动态控件,我想主要的原因在于使用动态控件会带来一些问题,在做项目的过程中,我将由动态加载控件引发的总是作了一个小小的总结。
1、在使用LoadControl加载控件后,用户控件中的某些控件不再响应事件。
这个问题主要是由于将控件加载放在if(!
Page.IsPostBack)之内引起的,放在外面即可。
在思归的blog上对此问题进行了详细的说明。
2、用户控件中某些控件的响应出现问题,如某个按钮第一次选择时不触发CLICK事件,第二次可以了。
这是由于没有给控件设置ID引起的,控件ID的作用在下面详细讲述。
如
ControluserControl=(Control)Page.LoadControl(“Test.ascx”);
userControl.ID=“Test”;
AddControl(userControl);
3、如果用户控件中包括DataGrid控件,那么加载控件后可能出现不响应DataGrid事件的问题。
这好像是一个bug,必须要将加载的控件进行强制转换,如:
TestuserControl=(Test)Page.LoadControl(“Test.ascx”);
注意:
上面使用的是Test类型,而不是Control!
我在以前的Blog中曾提到过这个问题,这种方式将使系统的扩展性降低。
我有一个解决方案可以和大家讨论(运用策略模式):
publicclassBaseControl:
System.Web.UI.UserControl
{
publicvirtualBaseControlProcessThisControl();
}
所有的用户控件从BaseControl继承,如果有Datagrid控件,由overideProcessThisControl方法,如:
returnthisasTest;
按如下方式加载控件:
BaseControluserControl=(BaseControl)Page.LoadControl(“Test.ascx”);
userControl.ProcessThisControl();
4、在用户控件中如何使用JavaScript
大家都知道,使用客户端的脚本将大大提高页面的响应速度,同时可以避免频繁地刷新页面。
所以使用javascript来实现页面中部分控制是一个比较好的方式,但是在用户控件中如果访问某一个子控件呢?
使用方式如下:
document.all.<%=TestControl.ClientID%><%=lstUser.ClientID%>.disabled=true; //将TestControl设置为不可用
如果在C#脚本中应该这样写:
Page.RegisterStartupScript("OnInitControl","document.all.Test_TestControl.disabled=true;"); //Test为用户控件,TestControl为用户控件中的子控件。
现在说一下控件ID,在访问aspx文件时,IIS会将aspx的脚本进行编译。
编译的时候将用户控件中的内容写在同一个页面中,为了防止页面中的控件与用户控件中的控件名称相同,在编译的时候对用户控件中的控件名称修改为:
用户控件名:
子控件,控件ID则修改为用户控件ID_子控件ID。
在动态加载控件时,如果不对控件的ID进行赋值,则控件ID为上一次加载的控件ID,因此在加载用户控件后应该立即对其设置ID。
如何实现动态加载用户控件
1.编程创建用户控件示例
(1)创建一个简单的用户控件
创建一个名为UserControlExample.ascx的用户控件,代码如下:
<%@ControlLanguage="c#"AutoEventWireup="false"%>
voidEnterBtn_Click(ObjectSender,EventArgsE)
{
Label1.Text="嗨"+Name.Text+",欢迎来到ASP.NET!
";
}
一个简单的用户控件
输入名字:
textboxid="Name"runat="server"/>
buttonText="Enter"OnClick="EnterBtn_Click"runat="server"ID="Button1"/>
labelid="Label1"runat="server"/>
(2)在页面中编程创建用户控件的实例
创建一个名为UserControlTest.aspx的页面,代码如下:
<%@Pagelanguage="c#"%>
voidPage_Load(objectsender,System.EventArgse)
{
ControlmyControl=Page.LoadControl("UserControlExample.ascx");
PlaceHolder1.Controls.Add(myControl);
}
编程创建用户控件的实例
PlaceHolderid="PlaceHolder1"runat="server">
PlaceHolder>
2.代码分析
看UserControlTest.aspx页面代码。
Page.LoadControl()方法的参数是用户控件的虚拟路径,返回值是一个UserControl对象,UserControl对象是由Control类派生,因此可以用Control对象的引用指向LoadControl()方法的返回值。
ControlmyControl=Page.LoadControl("UserControlExample.ascx");
PlaceHolder1.Controls.Add(myControl);
通过PlaceHolder容器控件把用户控件的对象添加进来,完成动态加载用户控件的过程
所谓动态加载,就是一开始不把用户控件直接添加到.aspx页面上,而是根据需要从codebehind代码那里以编程方式添加。
这样做的好处是可以针对不同的需要加载不同的用户控件。
要注意的是,我这里说的加载的办法是用codebehind时要做的,如果只是用