在ASPNET页面中动态添加控件.docx

上传人:b****2 文档编号:24551197 上传时间:2023-05-28 格式:DOCX 页数:11 大小:24.87KB
下载 相关 举报
在ASPNET页面中动态添加控件.docx_第1页
第1页 / 共11页
在ASPNET页面中动态添加控件.docx_第2页
第2页 / 共11页
在ASPNET页面中动态添加控件.docx_第3页
第3页 / 共11页
在ASPNET页面中动态添加控件.docx_第4页
第4页 / 共11页
在ASPNET页面中动态添加控件.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

在ASPNET页面中动态添加控件.docx

《在ASPNET页面中动态添加控件.docx》由会员分享,可在线阅读,更多相关《在ASPNET页面中动态添加控件.docx(11页珍藏版)》请在冰豆网上搜索。

在ASPNET页面中动态添加控件.docx

在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时要做的,如果只是用

相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1