摘要:在 Web Form 動態建立控制項的正確方法
很多 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

02

03

04

05 oTextBox.ID = "myTextBox"
06

07

08

09 oButton.ID = "myButton"
10

11

12

13 '將 Button 的 Click 事件導向 Button_Click 函式
14

15

16

17
18

19

20

21

22

23

24

25

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