在ASPNET页面中动态添加控件=_第1页
在ASPNET页面中动态添加控件=_第2页
在ASPNET页面中动态添加控件=_第3页
在ASPNET页面中动态添加控件=_第4页
在ASPNET页面中动态添加控件=_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在ASP.NET页面中动态添加控件微软示例:就像您可以通过编程方式在 Web 窗体页上创建任意 ASP.NET 服务器控件的实例,您也可以通过使用包含页的 LoadControl 方法来做到这一点。但您首先必须使用 Control 指令的 className 属性将强类型与用户控件相关联。之所以需要这样是因为 LoadControl 方法返回 Control 类的类型,并且您需要将该用户控件转换为合适的强类型,以便设置该控件的各个属性。以下代码使用 className 属性将 MyUserControl.ascx 文件中保存的用户控件转换为强类型。以编程方式创建用户控件的实例 1. 使用 Re

2、ference 指令在要包含用户控件的 Web 窗体页的顶部注册该用户控件。当以编程方式创建用户控件时,只有您创建了对该控件的引用后,用户控件的强类型才可用于该 Web 窗体页。例如,以下代码创建对 MyUserControl.ascx 文件中所创建用户控件的引用。 注意 当以声明方式在 Web 窗体页中创建用户控件的实例时,请使用 Register 指令。2. 在代码隐藏类文件中,或是在包含 .aspx 文件的代码声明块中,创建用户控件的实例。根据需要分配属性值,并使用 Add 方法将该控件添加到包含页的 ControlCollection 对象上。这使该控件可用于该页的继承的 Contro

3、l.Controls 属性。在以下示例中,创建 MyUserControl.ascx 的实例并将其 BackColor 属性设置为 beige。 C#Control c1 = LoadControl(MyUserControl.ascx);(MyUserControl)c1).BackColor = beige;Page.Controls.Add(c1);Visual BasicDim c1 As UserControl = LoadControl(MyUserControl.ascx)CType(c1, MyUserControl).BackColor = beigePage.Control

4、s.Add(c1)注意 当您使用 Add 方法将控件添加到 ControlCollection 对象时,这些控件将按处理顺序放置在集合中。如果您希望将控件添加到集合中的特定位置,请使用 AddAt 方法并指定您要存储该控件的索引位置。地址:ms-help:/MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconinstantiatingusercontrolsprogrammatically.htm鸿雪示例:注: 本方法是我同事李强原创步骤一: 把ascx控件拖入设计窗口,然后转入html模式,保留定义如果你需要多个ascx的话,请全部拖入。但是把相应的内容删除。(

5、因为我们需要动态加载)在需要填入控件的地方,放个容器,比如td,并设定在服务器端运行如2:动态调用UserControl myusercontrol = (UserControl) LoadControl (./includes/pageNavigater.ascx) ; Type myusertype = myusercontrol.GetType();/下面是给ascx赋值PropertyInfomyuserinfo1 = myusertype.GetProperty(RelatedDatagrid);/) .GetProperty(RelatedDatagrid);myuserinfo1

6、.SetValue(myusercontrol,gridhwcy,null);PropertyInfomypassinfo = myusertype.GetProperty(torefresh);mypassinfo.SetValue(myusercontrol,true,null );PropertyInfomyuserdatasource = myusertype.GetProperty(RelatedDataSource);myuserdatasource.SetValue(myusercontrol,dv,null);tdpan.Controls.Clear();tdpan.Contr

7、ols.Add(myusercontrol);动态加载用户控件,关于后台添加、修改的思考一直以来,我都在思考,一些繁琐的操作,比如我们一般的管理后台,很多都是数据的添加、修改与删除,列表的操作,而且一般我们都是用.aspx文件去做的。看下下面这个典型的后台(比较粗糙):说实在,我很厌倦全部用.aspx文件去做,比如“友情连接”这个模块,就有“添加友情连接”“修改友情连接”“友情连接列表”,简单的话,可以把“添加”“修改”合成一个文件。每次都去建立一个.aspx文件。我现在的想法是用“用户控件+配置文件”去实现,虽然文件数目可能不会少很多。但在编程到一定地步,我想大家会有跟我一样的想法。 首先需

8、要涉及的是动态添加“用户控件”,这个可以根据传参来动态加载,代码如下:protected Control control; protected void Page_Load(object sender, EventArgs e) int id = Convert.ToInt32(Request.QueryStringid); switch (id) case 0:/不要加载用户控件 Response.Write(您没有加载任何控件); break; case 1:/加载用户控件 control = Page.LoadControl(/login.ascx); control.ID = uc1;

9、/这里命名是为了可以取得里面控件的值 placeholder1.Controls.Add(control); break; default: break; 而只需要用到一个.aspx文件,且这个文件中有个用户控件,代码如下:如果这个“用户控件”中有一个ID为“tbxUserName”的TextBox,那么在.aspx文件中,要取得这个的值,代码如下:(TextBox)placeholder1.FindControl(uc1).FindControl(tbxUserName).TextASP.net中动态加载用户控件UserControl control = (_pager.LoadContro

10、l(String.Format(/WebUC/0.ascx, _ctrlId) as UserControl;control.ID = uc_ + _ctrlId;_panelControl.Controls.Add(control);ASP.net中动态加载用户控件时一些问题的总结经常见到有人说在ASP.net中不要使用动态控件,我想主要的原因在于使用动态控件会带来一些问题,在做项目的过程中,我将由动态加载控件引发的总是作了一个小小的总结。1、在使用LoadControl加载控件后,用户控件中的某些控件不再响应事件。这个问题主要是由于将控件加载放在if (!Page.IsPostBack)之

11、内引起的,放在外面即可。在思归的blog上对此问题进行了详细的说明。2、用户控件中某些控件的响应出现问题,如某个按钮第一次选择时不触发CLICK事件,第二次可以了。这是由于没有给控件设置ID引起的,控件ID的作用在下面详细讲述。 如 Control userControl=(Control)Page.LoadControl(“Test.ascx”);userControl.ID=“Test”;AddControl(userControl);3、如果用户控件中包括DataGrid控件,那么加载控件后可能出现不响应DataGrid事件的问题。这好像是一个bug,必须要将加载的控件进行强制转换,如:

12、Test userControl=(Test)Page.LoadControl(“Test.ascx”); 注意:上面使用的是Test类型,而不是Control!我在以前的Blog中曾提到过这个问题,这种方式将使系统的扩展性降低。 我有一个解决方案可以和大家讨论(运用策略模式):public class BaseControl : System.Web.UI.UserControlpublic virtual BaseControl ProcessThisControl();所有的用户控件从BaseControl 继承,如果有Datagrid控件,由overide ProcessThisCon

13、trol方法,如:return this as Test;按如下方式加载控件:BaseControl userControl=(BaseControl )Page.LoadControl(“Test.ascx”);userControl.ProcessThisControl();4、在用户控件中如何使用JavaScript大家都知道,使用客户端的脚本将大大提高页面的响应速度,同时可以避免频繁地刷新页面。所以使用javascript来实现页面中部分控制是一个比较好的方式,但是在用户控件中如果访问某一个子控件呢?使用方式如下:document.all.disabled=true; /将TestCo

14、ntrol设置为不可用如果在C#脚本中应该这样写:Page.RegisterStartupScript(OnInitControl,document.all.Test_TestControl.disabled=true;); /Test为用户控件,TestControl为用户控件中的子控件。现在说一下控件ID,在访问aspx文件时,IIS会将aspx的脚本进行编译。编译的时候将用户控件中的内容写在同一个页面中,为了防止页面中的控件与用户控件中的控件名称相同,在编译的时候对用户控件中的控件名称修改为 : 用户控件名:子控件 ,控件ID则修改为 用户控件ID_子控件ID。在动态加载控件时,如果不对

15、控件的ID进行赋值,则控件ID为上一次加载的控件ID,因此在加载用户控件后应该立即对其设置ID。如何实现动态加载用户控件1.编程创建用户控件示例(1)创建一个简单的用户控件创建一个名为UserControlExample.ascx的用户控件,代码如下:void EnterBtn_Click(Object Sender, EventArgs E)Label1.Text = 嗨 + Name.Text + ,欢迎来到ASP.NET!;一个简单的用户控件输入名字:(2)在页面中编程创建用户控件的实例创建一个名为UserControlTest.aspx的页面,代码如下:void Page_Load(o

16、bject sender, System.EventArgs e)Control myControl = Page.LoadControl(UserControlExample.ascx);PlaceHolder1.Controls.Add(myControl);编程创建用户控件的实例2.代码分析 看UserControlTest.aspx页面代码。Page.LoadControl()方法的参数是用户控件的虚拟路径,返回值是一个UserControl对象,UserControl对象是由Control类派生,因此可以用Control对象的引用指向LoadControl()方法的返回值。 Cont

17、rol myControl = Page.LoadControl(UserControlExample.ascx); PlaceHolder1.Controls.Add(myControl); 通过PlaceHolder容器控件把用户控件的对象添加进来,完成动态加载用户控件的过程所谓动态加载,就是一开始不把用户控件直接添加到.aspx页面上,而是根据需要从codebehind代码那里以编程方式添加。这样做的好处是可以针对不同的需要加载不同的用户控件。要注意的是,我这里说的加载的办法是用codebehind时要做的,如果只是用块在aspx页面加代码来实现这个,可能方法会不同,具体可以参看.net

18、 framework sdk 文档,地址-点这里-。ms-help:/MS.NETFrameworkSDKv1.1.CHS/cpguidenf/html/cpconinstantiatingusercontrolsprogrammatically.htm下面来看codebehind的解决办法。 注意这里用的示例控件是第22篇文章“用户控件(添加事件)”里的那个。加载用户控件是用LoadControl方法,Control uclogin=LoadControl(xxx.ascx);这一句就是把xxx.ascx文件里的用户控件取出来,返回的是Control类型得到用户控件后,就可以把控件加到页面的

19、某个容器控件里面/声明一个容器protected System.Web.UI.WebControls.PlaceHolder placelogin;/把刚才的控件加到里面placelogin.Controls.Add(uclogin);PlaceHolder控件是一个专门用来乘放东西的控件,在页控件层次结构中为以编程方式添加的控件保留位置。这样基本工作就完成了,但是要做的还有很多。如果只是这样做的话,我们没有办法使用用户控件自定义的属性和事件。因为这里是加载了一个Control类型的控件。要使用我们自己的控件,需要做的就是把这个转换成自己的控件类型。从面向对象的角度来看,其实就是在同一个命名空

20、间里做的两个类之间的操作。private uc_event uclogin;private void Page_Load(object sender, System.EventArgs e) uclogin=(uc_event)LoadControl(uc_event.ascx); placelogin.Controls.Add(uclogin); uclogin.boxBgColor=#000000;上面的代码顺便加了一个设置属性的语句,现在这个语句可以起作用。值得一提的是,一般在这里会给出智能提示来让你选择需要的属性。还记得我们的uc_event控件还有一个logiin事件吗?现在我们也可

21、以使用这个事件,按照事件一般都放到 InitializeComponent()里面,我们也可以把这个事件放到那里,private void InitializeComponent() this.Load += new System.EventHandler(this.Page_Load); this.uclogin.login+=new prac.uc_event.loginhandler(uclogin_login);然后运行出错了吧这是因为的页面执行流程是 OnInit - Page_Load , InitializeComponent()在OnInit里面,所以就先执行这个,可是在运行这

22、个的时候还没有对uclogin进行具体的操作呢!解决的办法是把这个事件的订阅放到设置属性的后面uclogin=(uc_event)LoadControl(uc_event.ascx);placelogin.Controls.Add(uclogin);uclogin.boxBgColor=#000000;this.uclogin.login+=new prac.uc_event.loginhandler(uclogin_login);这样就没有问题了。现在可以容易的根据条件进行不同控件的加载了。 private uc_event uclogin;private userck uck;private void Page_Load(object sender, System.EventArgs e) if(Sessionlogin!=null) if(Sessionlogin.ToString()=red) uclogin=(uc_event)LoadControl(uc_event.ascx); placelogin.Controls.Add(uclogin); uclogin.boxBgColor=#000000; this.uclogin.login+=new pr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论