1. 程式人生 > >C# 關於控制元件的z-order(Z軸次序)屬性(By dlm)

C# 關於控制元件的z-order(Z軸次序)屬性(By dlm)

有時候需要在程式執行到一定時候或者某個事件之後需要動態生成控制元件
在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寫一個單擊事件。

動態新增控制元件的事件,語句: 

Code
Control.Command += new CommandEventHandler(this.EventFun);

具體的程式碼請看下面:

需要特別注意的是:

新增控制元件和給控制元件加事件時絕對不能放到 if(!IsPostback){}裡面,那樣的話,點選一次後控制元件會消失,而且事件也不

會執行。

Code
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>");
}
http://www.cnblogs.com/zhuimengke/articles/1283973.html
http://www.cnblogs.com/xuasmi/

動態新增控制元件並新增事件 分類:asp.net2007.5.15 22:48 作者:小怪物 | 評論:1 | 閱讀:1393 
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")