很多ASP.NET 初学者对于在Web Form 动态建立控件的问题困扰,常见到的问题是为何动态建立的控件无法像拖曳到画面上的控件有一样的效果,例如无法加载ViewState 的数据 (无法呈现更新的值) 及动态控件事件处理等等问题。
以下这个范例就是说明如何在Web Form 上动态建立一个TextBox 及Button 控件,并处理Button 的Click 事件。
1 Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
2 Dim oTextBox As New TextBox()
3 Dim oButton As New Button()
4
5 oTextBox.ID = "myTextBox"
6 oTextBox.Text = "AAA" 'TextBox的初始值为 AAA
7 Me.Form.Controls.Add(oTextBox)
8
9 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
2 Dim oTextBox As New TextBox()
3 Dim oButton As New Button()
4
5 oTextBox.ID = "myTextBox"
6 oTextBox.Text = "AAA" 'TextBox的初始值为 AAA
7 Me.Form.Controls.Add(oTextBox)
8
9 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 中加载更新控件的属性值。