引用:
c#类中实现事件
private Button Db=new Button() ; Db.Name="Dy_Button" //设定名称 Db.Location=new Point(100,200);//设定位置 。。。。//其他属性设置 //这里添加消息处理 。。 this.Controls.Add (Db);//添加到控件组中
这样就完成了动态生成但是需要给控件添加消息处理事件
那么现在就需要在生成控件添加到控件组前增加如下语句:
DPB.MouseClick += new EventHandler(this.pictureBox_MouseClick);
现在编写这个消息处理的函数pictureBox_Click()
private void pictureBox_MouseClick(object sender,EventArgs e) { MessageBox.Show("click"); }
这样完成了事件处理的添加
首先,创建一个全局变量"i "用来区分各个新的按钮:
private int i=0;
然后在已有的按钮中添加方法如下:
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():
private void btn_click(object sender, System.EventArgs e) { Button b1 = (Button)sender;//将触发此事件的对象转换为该Button对象 MessageBox.Show(""+b1.Name); }
至此就已经完成了动态创建按钮和事件
ASP.net为控件动态添加事件
实现的功能是在网页上的Panel中动态添加一个Button,并为这个Button写一个单击事件。
动态添加控件的事件,语句:
Control.Command += new CommandEventHandler(this.EventFun);
具体的代码请看下面:
需要特别注意的是:
添加控件和给控件加事件时绝对不能放到 if(!IsPostback){}里面,那样的话,点击一次后控件会消失,而且事件也不
会执行。
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>"); }
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")