有时候需要在程序运行到一定时候或者某个事件之后需要动态生成控件
在C#下一般方式是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | private Button Db= new Button() ; Db.Name= "Dy_Button" //设定名称 Db.Location= new Point(100,200); //设定位置 。。。。 //其他属性设置 //这里添加消息处理 。。 this .Controls.Add (Db); //添加到控件组中 |
这样就完成了动态生成但是需要给控件添加消息处理事件
那么现在就需要在生成控件添加到控件组前增加如下语句:
1 | Dpb.MouseClick += new EventHandler( this .pictureBox_MouseClick); |
现在编写这个消息处理的函数pictureBox_Click()
1 2 3 4 5 6 7 | private void pictureBox_MouseClick( object sender,EventArgs e) { MessageBox.Show( "click" ); } |
这样完成了事件处理的添加
首先,创建一个全局变量"i "用来区分各个新的按钮:
1 | private int i=0; |
然后在已有的按钮中添加方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | private void button1_Click( object sender, System.EventArgs e) { i++; Button b = new Button(); //创建一个新的按钮 b.Name= "b" +i; //这是我用来区别各个按钮的办法 System.Drawing.Point p = new Point(12,13+i*30); //创建一个坐标,用来给新的按钮定位 b.Location = p; //把按钮的位置与刚创建的坐标绑定在一起 panel1.Controls.Add(b); //向panel中添加此按钮 b.Click += new System.EventHandler(btn_click); //将按钮的方法绑定到按钮的单击事件中b.Click是按钮的单击事件 } |
完成以上步骤就已经可以进行动态按钮的创建
下面我们来讲如何对新建的按钮添加对应的事件方法btn_click():
1 2 3 4 5 6 7 8 9 10 11 | private void btn_click( object sender, System.EventArgs e) { Button b1 = (Button)sender; //将触发此事件的对象转换为该Button对象 MessageBox.Show( "" +b1.Name); } |
至此就已经完成了动态创建按钮和事件
asp.net为控件动态添加事件
实现的功能是在网页上的Panel中动态添加一个Button,并为这个Button写一个单击事件。
动态添加控件的事件,语句:
1 | Control.Command += new CommandEventHandler( this .EventFun); |
具体的代码请看下面:
需要特别注意的是:
添加控件和给控件加事件时绝对不能放到 if(!IsPostback){}里面,那样的话,点击一次后控件会消失,而且事件也不
会执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | protected void Page_Load( object sender, EventArgs e) { //将输入字符串分析为System.Web.UI.Control对象,b为传进去的值 Control c = ParseControl( "<asp:Button Text = '按我' ID = 'myButton' commandargument = 'b' runat = 'server' />" ); //将控件添加大Panel中 this .Panel1.Controls.Add(c); //查找页面名为myButton的控件 Button Button = (Button)Page.FindControl( "myButton" ); //添加事件On_Button Button.Command += new CommandEventHandler( this .On_Button); } //CommandEventArgs为command事件提供数据 protected void On_Button(Object sender,CommandEventArgs e) { Response.Write( "<script language = 'javascript' type = 'text/javascript'>alert('" + e.CommandArgument.ToString() + "');</script>" ); } |
动态添加控件并添加事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | private void Page_Load( object sender, System.EventArgs e) { Button Button1 = new Button(); Button1.CommandArgument = "b1" ; Button1.Text = "Btn1" ; Button1.Command += new CommandEventHandler( this .OnButton); PlaceHolder1.Controls.Add(Button1); Button Button2 = new Button(); Button2.CommandArgument = "b2" ; Button2.Text = "Btn2" ; Button2.Command += new CommandEventHandler( this .OnButton); PlaceHolder1.Controls.Add(Button2); Control c3 = ParseControl( "<asp:Button id='Button3' text='Btn3' commandname='Btn' commandargument='b3' runat='server' />" ); //将字符串转换成web控件 Control c4 = ParseControl( "<asp:Button id='Button4' text='Btn4' commandname='Btn' commandargument='b4' runat='server' />" ); PlaceHolder1.Controls.Add(c3); PlaceHolder1.Controls.Add(c4); Button myBut = (Button)Page.FindControl( "Button3" ); myBut.Command += new CommandEventHandler( this .OnButton); Button myBut2 = (Button)Page.FindControl( "Button4" ); myBut2.Command += new CommandEventHandler( this .OnButton); } public void OnButton(Object Sender, CommandEventArgs e) { switch (e.CommandArgument.ToString().ToLower()) { case "b1" : Label1.Text = "Button 1" ; break ; case "b2" : Label1.Text = "Button 2" ; break ; case "b3" : Label1.Text = "Button 3" ; break ; case "b4" : Label1.Text = "Button 4" ; break ; }; } |
我项目中遇到的是动态创建Tab选项卡和Gridview,按下面的方法可以,创建它们当然在page_load里了,有时,它会引起你页面上其它的按钮用不了,这时,你可以把它们不放在page_load里,而放在page_init里,这样就不会有问题了,我不知其它的Ajax控件会不会有这样的问题,我创建TabPanel时,就出现异常。我把它们放在Page_Init里就不会这样了。
动态添加AjaxControl Toolkit的Tab控件及设置模板
有朋友在使用AjaxControl Toolkit里的Tab控件,他刚刚问怎么实现在cs里动态添加TabPanel项。我建了一个项目试了一下。主要问题是TabPanel里如何创建ContentTemplate。
<ajaxToolkit:TabContainer>控件使用方法比较简单,直接拖到页面上,添加TabPanel,然后直接输入TabPanel的内容就可以了,控件完全支持设计时的WYSIWYG,非常方便。TabPanel里的内容是通过<contenttemplate></contenttemplate>来指定的。这个对应于TabPanel的ContentTemplate属性,VS里intellisense显示它的类型是ITemplate,这是一个接口,我试着在intellisense里找找有没有类实现了这个接口,但一无所获。找不到这个类,就没有办法给ContentTemplate赋值。于是查看了一下Tab控件的源码,又查阅了MSDN,终于把问题解决了。
问题关键就在于这个实现了ITemplate接口的类,我找不到,只好自己写了一个。也不知道有没有别的方法,希望有知道的朋友告诉我。全部代码如下:
using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using AjaxControlToolkit; //记得加上这个啊public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { TabContainer tabContainer1 = new TabContainer(); TabPanel tab1 = new TabPanel(); tab1.HeaderText = "标签1"; tabContainer1.Tabs.Add(tab1); TabPanel tab2 = new TabPanel(); tab2.HeaderText = "标签2"; tabContainer1.Tabs.Add(tab2); //建立第一个Tab里的内容 Panel panel1 = new Panel(); Label label1 = new Label(); label1.Text = "这是第一个Tab"; panel1.Controls.Add(label1); //创建一个Template TabContentTemplate temp1 = new TabContentTemplate(); //添加子控件 temp1.SetTemplate(panel1); tab1.ContentTemplate = temp1; this.form1.Controls.Add(tabContainer1); }}public class TabContentTemplate : ITemplate{ private Control _template; public void SetTemplate(Control templateControl) { _template = templateControl; } ITemplate Members#region ITemplate Members public void InstantiateIn(Control container) { container.Controls.Add(_template); } #endregion}
很多控件,如GridView、Repeat等都使用了Template,应该也都可以按这种方法来实现动态设置模板了。
BTW,另外还有一种方法动态设置模板,就是使用Page.LoadTemplate("template.ascx"),如tab1.ContentTemplate=Page.LoadTemplate("template.ascx")
联系客服