有時候需要在程序運行到一定時候或者某個事件之後需要動態生成控件
在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")