2007年8月9日 星期四

動態產生按鈕及觸發事件

當有需要動態產生按鈕時,我們會考量幾個狀況,第一是畫面編排,第二則是按鈕 click 後觸發事件的處理。在畫面編排裡,由於按鈕

是屬於 WebControls 的物件之一,他必須要放在 Form裡面。所以我們可以事先在畫面上拉一個Panel,用他來擺放待會要動態產生的

按鈕物件。另外,為了能讓按鈕擺放能夠更美觀,所以會增加<Table>標籤來完成。


在ASPX頁面,範例程式如下所示:


<body>

            <form id="Form1" method="post" runat="server">

                        <asp:Panel id="Panel1"  runat="server"></asp:Panel>

            </form>

</body>


在ASPX.CS 頁面,範例程式如下:

private void Page_Load(object sender, System.EventArgs e)
{
//用來自動產生項目的資料來源
string [] oAL=new string[]{"kimo","pchome","google"} ;
//宣告 Table 物件
Table oTable=new Table();
//宣告 TableRow 物件
TableRow oTR=new TableRow();
//宣告 TableCell 物件
TableCell oTC;
//宣告 動態產生的 按鈕 物件
Button oB;

//動態產生按鈕的迴圈
for(int i=0;i<oAL.Length;i++)
{
//實體化一個 TableCell
oTC=new TableCell();
//實體化一個按鈕
oB=new Button();
//設定按鈕的物件識別編號
oB.ID="Btn"+oAL[i].ToString();
//設定按鈕的Text屬性
oB.Text="Btn"+oAL[i].ToString();
//設定按鈕click的觸發事件,oB_Click 指的是click後對應的事件名稱
oB.Click+=new EventHandler(oB_Click);
//將動態產生的 Button 加到 TableCell 裡面
oTC.Controls.Add(oB);
//設定 TableCell的邊寬為 1 px
oTC.BorderWidth=Unit.Pixel(1);
//將動態產生的 TableCell 加入到 動態產生的 TableRow
oTR.Cells.Add(oTC);

}

//將動態產生的 TableRow 加到 動態產生的 Table
oTable.Rows.Add(oTR);

//將動態產生的 Table 加入到 Panel1
Panel1.Controls.Add(oTable);

}

public void oB_Click(object sender, System.EventArgs e)
{
string strComeFrom=string.Empty;

//取得呼叫者的 ClientID
strComeFrom=((Button)sender).ClientID;

Response.Write(strComeFrom);
}


為何要將整個動態產生的程式碼寫在Page_Load()事件裡,而且不放在 !IsPostBack 區段,
主要是因為當按鈕被觸發之後,如果把動態產生的物件寫在 !IsPostBack 裡,會找不到原先
所建立的動態物件。所以我們把這段程式放在 Page_Load(),並讓每一次的PostBack都重新
去執行一次。

沒有留言:

張貼留言