|
分類:[ASP.NET (VB)]
Visual Studio 2008 Pro
.NET Framework 3.5 SP1
これまでWindowsフォームアプリケーションしか開発したことがなかったのですが
ASP.netでWebアプリケーションを開発することになり、かなり悩んでおります
動作時に動的にテキストボックスを追加し、入力や参照を行いたく、サンプルを
調べていたところ下記のようにするとうまくいくことがわかりました。
フォームには最初からLabel1とButton1があり、動的にテキストボックスを追加し、
Button1が押されたらその内容をLabel1に表示するというものです。
------------------------------------------------------------------------
Partial Public Class TEST
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
MakeTextBox()
Else
MakeTextBox() '[1]
End If
End Sub
Private Sub MakeTextBox()
Dim tbx As New TextBox
tbx.ID = "DynamicTextBox"
tbx.Text = "初期値" '[3]
form1.Controls.Add(tbx)
End Sub
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
Dim tbx As New TextBox
tbx = CType(FindControl("DynamicTextBox"), TextBox)
Label1.Text = tbx.Text '[2]
End Sub
End Class
------------------------------------------------------------------------
疑問点が2つあります
【疑問1】
上記ソースを動かすと、期待した動作をします。テキストボックスにABCと入力して
ボタンを押すと、ラベルにはABCと表示されます。
しかし、実際にはボタンを押すとまずPage_Loadが呼び出され、そこからMakeTextBoxが
処理され、それからButton1_Clickが処理されるという順番で動くようです。
つまり、[2]の部分より[3]の部分のほうが先に動くわけですが、その場合、[3]の時点で
テキストボックスには「初期値」という文字列が入っているはずなのに、なぜ
[2]の部分で「ABC」という文字列が取得できるのでしょうか。
【疑問2】
[1]の行をコメントにすると、[2]のところでエラーとなります。
(オブジェクト参照がオブジェクトインスタンスに設定されていません、となります)
正常に動作する場合の動きから考えると、ボタンを押した時点でテキストボックスの
内容がサーバーに送られていてそれがサーバー側に保存されている?ような気がするので、
[1]は無くても良いような気がするのですが、なぜエラーとなるのでしょうか。
とりあえず期待した動作はしているのですが、どうも腑に落ちません。
初歩もいいところな質問で申し訳ありませんが、よろしくお願い致します。
|