很多 ASP.NET 初學者對於在 Web Form 動態建立控制項的問題困擾,常見到的問題是為何動態建立的控制項無法像拖曳到畫面上的控制項有一樣的效果,例如無法載入 ViewState 的資料 (無法呈現更新的值) 及動態控制項事件處理等等問題。

以下這個範例就是說明如何在 Web Form 上動態建立一個 TextBox 及 Button 控制項,並處理 Button 的 Click 事件。

01     Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
02         Dim oTextBox As New TextBox()
03         Dim oButton As New Button()
04
05         oTextBox.ID = "myTextBox"
06         oTextBox.Text = "AAA"           'TextBox的初始值為 AAA
07         Me.Form.Controls.Add(oTextBox)
08
09         oButton.ID = "myButton"
10         oButton.Text = "按鈕"
11         Me.Form.Controls.Add(oButton)
12
13         '將 Button 的 Click 事件導向 Button_Click 函式
14         AddHandler oButton.Click, AddressOf Button_Click
15     End Sub

16
17
18     'Button 的 Click 事件導向函數
19     Protected Sub Button_Click(ByVal sender As Object, ByVal e As System.EventArgs)
20         Dim oTextBox As TextBox = Nothing
21         oTextBox = CType(Me.FindControl("myTextBox"), TextBox)
22         If oTextBox IsNot Nothing Then
23             oTextBox.Text = "BBB"
24         End If
25     End Sub

為何要在 Init 事件中就動態建立控制項,而不是在 Load 事件中呢?主要的原因是 Init 事件在 LoadViewState 之前發生,而 Load 事件是在 LoadViewState 之後。你要在 LoadViewState 之前就把控制項準備好,機制才能由 ViewState 中載入更新控制項的屬性值。


DotBlogs Tags: 動態建立控制項

Feedback

  • clark 2008/5/27 下午 05:07 回覆

    # re: 在 Web Form 動態建立控制項的正確方法

    正在尋找:
    根據條件判斷,做WizardSteps的顯示(wizard控制項)
    感謝,受用了

  • DavidCheng 2008/6/12 上午 10:45 回覆

    # re: 在 Web Form 動態建立控制項的正確方法

    請問,那該如何動態建立"使用者控制項"呢?

  • jeff377 2008/6/12 下午 12:19 回覆

    # re: 在 Web Form 動態建立控制項的正確方法

    使用 LoadControl

    Dim myControl1 As MyControl = CType(LoadControl("TempControl_Samples1.vb.ascx"),MyControl) PlaceHolder1.Controls.Add(myControl1)

     

  • Boris 2008/12/31 下午 05:13 回覆

    # re: 在 Web Form 動態建立控制項的正確方法

    oButton.ID = "myButton" & index
    oButton.Text = "按鈕"
    Me.Form.Controls.Add(oButton)

    '將 Button 的 Click 事件導向 Button_Click 函式
    AddHandler oButton.Click, AddressOf Button_Click
    ================================================
    請問能給予指導 有辦法把index傳遞給Button_Click函式嗎?

    類似Function(test)這樣..

  • peter 2009/5/8 下午 03:27 回覆

    # re: 在 Web Form 動態建立控制項的正確方法

    請問一下

    如果已經動態新增上去的控制項

    可以在其他方法中刪除嗎??

  • walter 2009/6/20 下午 04:31 回覆

    # re: 在 Web Form 動態建立控制項的正確方法

    to peter : 動態新增的按鈕也可以刪除,我測試在 Button 按下去時使用 Me.Form.Controls.Remove(oButton) 移除按鈕是沒有問題的。

  • 卓小萍 2009/7/27 上午 10:48 回覆

    # re: 在 Web Form 動態建立控制項的正確方法

    請問一下大大...
    如果動態產生的控制項是在MasterPage內??
    而且還包在Panel,要如果抓取該ID??

  • hatelove 2009/7/27 上午 11:27 回覆

    # re: 在 Web Form 動態建立控制項的正確方法

    to 卓小萍 :

    用大大另一篇 使用遞迴findcontrol的方式,就能跳脫被container綁住findcontrol的問題。

    new control後在add時,可以把ID命的有意義一點,最麻煩的情況還可以用regular expression去過濾。

  • 卓小萍 2009/7/28 上午 11:15 回覆

    # re: 在 Web Form 動態建立控制項的正確方法

    Dear hatlove
    我後來用
    ContentPlaceHolder cph = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");
    這種方式把他像剝洋蔥一樣,一層一層剝開...
    結果,人就在我手上了...呵呵...
    但不知道與你的那個方式是否有差...

標題 *
名稱 *
Email (將不會被顯示)
Url
回應
登入後使用進階評論
Please add 5 and 6 and type the answer here: