當有需要動態產生按鈕時,我們會考量幾個狀況,第一是畫面編排,第二則是按鈕 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都重新
去執行一次。
沒有留言:
張貼留言