この資料では、ASPX Web ページでコントロールを動的に作成する方法について説明します。
サンプル プロジェクトは次の操作を行います。
-
2 つの TextBox コントロールを作成します。
-
TextBox の内容 (TextBox.text) と属性が、サーバーへのポスト時に保存されることを検証します。
-
動的に作成されたコントロールによってポストされるイベントが処理される方法を示します。
プロジェクトと静的コントロールを作成する
-
Visual Studio .NET で、Visual Basic .NET を使用して新しい Web プロジェクトを作成します。作成したプロジェクトに DynamicCreate という名前を付けます。
-
WebForm1.aspx ファイルを開き、HTML ビューに切り替えます。<HTML> タグと </HTML> タグの間に以下のコードを挿入します。
<HEAD>
<title>WebForm1</title>
<meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.0">
<meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:Button id="Button1" style="Z-INDEX: 100; LEFT: 23px; POSITION: absolute; TOP: 108px" runat="server" Text="Submit" Height="27px" Width="100px"></asp:Button>
<asp:Label id="Label4" style="Z-INDEX: 105; LEFT: 23px; POSITION: absolute; TOP: 197px" runat="server" Width="368px" EnableViewState="False"></asp:Label>
<asp:Label id="Label3" style="Z-INDEX: 104; LEFT: 23px; POSITION: absolute; TOP: 163px" runat="server" Width="368px" EnableViewState="False"></asp:Label>
<asp:Label id="Label2" style="Z-INDEX: 102; LEFT: 23px; POSITION: absolute; TOP: 60px" runat="server" Width="86px" Height="19px"> TextBox2:</asp:Label>
<asp:Label id="Label1" style="Z-INDEX: 101; LEFT: 23px; POSITION: absolute; TOP: 28px" runat="server" Width="86" Height="19"> TextBox1:</asp:Label></form>
</body>
-
デザイン ビューに切り替えて、プロジェクトで使用される静的に作成されたコントロールを表示します。
動的にコントロールを作成して接続する
-
ソリューション エクスプローラで [すべてのファイルを表示] をクリックして、WebForm1.aspx に関連するファイルの一覧を表示します。WebForm1.aspx.vb を開きます。
-
.vb (コード ビハインド) ファイルで TestBox コントロールを宣言し、.aspx ファイルの既存のフォーム要素の変数も宣言します。WebForm1 パブリック クラス宣言より後の宣言を次のように更新します。
Public Class WebForm1
Inherits System.Web.UI.Page
Protected WithEvents Button1 As System.Web.UI.WebControls.Button
Protected WithEvents Label4 As System.Web.UI.WebControls.Label
Protected WithEvents Label3 As System.Web.UI.WebControls.Label
Protected WithEvents Label2 As System.Web.UI.WebControls.Label
Protected WithEvents Label1 As System.Web.UI.WebControls.Label
' Added by hand for access to the form.
Protected Form1 As System.Web.UI.HtmlControls.HtmlForm
' Added by hand; will create instance in OnInit.
Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
Protected WithEvents TextBox2 As System.Web.UI.WebControls.TextBox
ツールボックスの TextBox を ASPX ページにドラッグする場合のように、TextBox 宣言は手作業で入力します。ただし、この場合はコントロールが動的に作成されます。
-
TextBox コントロールを動的に作成するためのコードを追加します。コントロールは、ページが実行されるたびに作成されます。コントロールの動的作成は、WebForm1 クラスによって提供される Page_Init 関数内で行うのが最良です。Page_Init 関数を見つけます。"Web フォーム デザイナで作成されたコード" というコメントが付いたコードを展開し、Page_Init 関数を、以下のように変更します。
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
' Create dynamic controls here.
TextBox1 = New TextBox()
TextBox1.ID = "TextBox1"
TextBox1.Style("Position") = "Absolute"
TextBox1.Style("Top") = "25px"
TextBox1.Style("Left") = "100px"
Form1.Controls.Add(TextBox1)
TextBox2 = New TextBox()
TextBox2.ID = "TextBox2"
TextBox2.Style("Position") = "Absolute"
TextBox2.Style("Top") = "60px"
TextBox2.Style("Left") = "100px"
Form1.Controls.Add(TextBox2)
' CODEGEN: The Web Form Designer requires this method call.
' Do not modify it by using the code editor.
InitializeComponent()
End Sub
このコードは、2 つの TextBox コントロールを動的に作成し、作成したコントロールの ID と位置を設定して、次にそれらのコントロールを Form Controls コレクションにバインドします。ASPX ページに Web フォームの Panel コントロールを追加して、Page_Init 関数でテキスト ボックスをコントロールにバインドします。この例を以下に示します。
TextBox1 = New TextBox()
TextBox1.ID = "TextBox1"
' comment add command the Form Controls collection as follows
' Form1.Controls.Add(TextBox1)'
Panel1.Controls.Add(TextBox1)
注 : Web フォームでコントロールを動的に作成する場合、コントロールを作成して、Page_Init イベント ハンドラまたは Page_Load イベント ハンドラで、作成したコントロールをコントロール コレクションに追加する必要があります。これを行わないと、コントロールが予期したように動作しない場合があります。
-
テキスト ボックスの Text プロパティを初期化します。既存の Page_Load 関数を次のように変更します。
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not IsPostBack Then
' Set the initial properties for the text boxes.
TextBox1.Text = "TextBox1"
TextBox2.Text = "TextBox2"
End If
End Sub
テキスト ボックスの初期値 (If Not IsPostBack) を設定する必要があるのは 1 回だけです。その後は、テキスト ボックスの IPostBackDataHandler インターフェイスによってこの情報が保持されるため、以降のポストで値を再設定する必要はありません。
-
TextBox の TextChanged イベントのハンドラを追加します。Page_Load 関数後に次のコードを追加します。
Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged, TextBox2.TextChanged
Dim txtBoxSender As TextBox
Dim strTextBoxID As String
txtBoxSender = CType(sender, TextBox)
strTextBoxID = txtBoxSender.ID
Select Case strTextBoxID
Case "TextBox1"
Label3.Text = "TextBox1 text was changed"
Case "TextBox2"
Label4.Text = "TextBox2 text was changed"
End Select
End Sub
このコードは、イベントを発生させたコントロールを特定し、適切な Label コントロールを使用してユーザーにそれを報告します。この関数は、動的に作成された両方の TextBox コントロールの TextChanged イベントを処理します。デフォルトでは、TextBox コントロールの AutoPostBack は false です。そのため、コントロールのテキストが変更されてもサーバーへのポストバックは発生しません。ただし、[Submit] をクリックしてフォームがサーバーにポストされた場合、TextBox コントロールの TextChanged イベントが発生し、この関数が呼び出されます。
サンプルを保存、ビルド、および実行する
サンプルを保存してビルドします。Visual Studio .NET でサンプルを実行するには、ASPX ファイルを右クリックし、ショートカット メニューの [ブラウザで表示] をクリックします。
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID
317515?
(http://support.microsoft.com/kb/317515/EN-US/
)
(最終更新日 2004-02-11) を基に作成したものです。
この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。