トップ回答者
UpdatePanleで作成したコントロールの取得方法

質問
-
こんにちは。Chip'nDaleです。
今回はAjaxのUpdatePanelの事で質問させて頂きたいと思います。
私は現在、Page_Loadイベントで回数を指定してその回数分の行とテキストボックスをテーブルに生成するということをUpdatePanelを使って行っています。行とテキストボックスを表示させるのはすぐに出来ました。
しかし、Buttonのクリックイベントで、生成したテキストボックスをFindControlを使って取得しようとしてもNothingとなってしまい取得できません。
UpdatePanelを使って生成したコントロールは取得することができないのでしょうか?
どなたか、わかる方がいらっしゃれば教えて頂きたいと思います。よろしくお願い致します。
FindControlでテキストボックスを取得する時のコードを載せておきます↓↓
dim tb as TextBox
tb= CType(Table1.FindControl("TextBox1"), TextBox)
回答
-
動的にコントロールを生成する場合、ポストバックを考慮して、コントロールの生成は Page.OnInit メソッドでおこなう必要があります。(ViewState などの設定のタイミング等々)
※これは UpdatePanel 等の AJAX 関連とは関係なく、通常の ASP.NET Web アプリケーションでも同じです。
とりあえず、DropDownList で回数を指定するとのことですので、テーブルの行数は固定値で問題なさそうですので、以下のコードを参考にしてください。
Code SnippetDim rowMax As Integer = 9
Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
MyBase.OnInit(e)Dim myexternal(rowMax) As TextBox
For i As Integer = 0 To rowMax
myexternal(i) = New TextBox
Dim BudgetEntryRow As New TableRow
Dim ExternalPaymentCell As New TableCellExternalPaymentCell.BorderColor = Drawing.Color.DodgerBlue
ExternalPaymentCell.Controls.Add(myexternal(i))
BudgetEntryRow.Cells.Add(ExternalPaymentCell)myexternal(i).ID = "MyExternal" & i
BudgetEntryRow.Visible = False
BudgetEntryTable.Rows.Add(BudgetEntryRow)
NextEnd Sub
Protected Sub Button1_Click( ...(中略)... ) Handles Button1.Click
For i As Integer = 0 To rowMax
BudgetEntryTable.Rows(i).Visible = False
NextDim rowNum As Integer = DropDownList1.SelectedValue
For i As Integer = 0 To rowNum - 1
Dim tb As TextBox = CType(BudgetEntryTable.FindControl("MyExternal" & i), TextBox)
tb.Text = "This is " & tb.ID
BudgetEntryTable.Rows(i).Visible = True
NextEnd Sub
Protected Sub Button2_Click( ...(中略)... ) Handles Button2.Click
Dim rowNum As Integer = DropDownList1.SelectedValue
For i As Integer = 0 To rowNum - 1
Dim tb As TextBox = CType(BudgetEntryTable.FindControl("MyExternal" & i), TextBox)...
Next
End Sub
すべての返信
-
すいません。こちらの書き込みに誤りがありました。
UpdatePanel内にTableを配置し、DropDownListで回数を指定します。
そしてButton1のButton1ClickイベントハンドラでUpdatePanel内のTableに指定した回数分の行を生成します。
Tableには項目が3つあるため、1行につき3つのセルとTextBoxを行生成と同時に動的に生成します。
以上が正しい動きです。
Button2Clickイベントハンドラ内では動的に生成したTextBoxに入力された値、つまりTextプロパティをFindControlを使って取得し、変数に代入していくという内容です。
UpdatePanel内に配置したTableを取得することはできるのですが、動的に生成した行やTextBoxは取得できませんでした(Nothingが変数に格納される)。
UpdatePanelのUpdateModeはConditionalにしてあります。
【Button1Clickイベントハンドラのコード】
n=指定回数
Session("n")=n
Dim myexternal(n) As TextBox
Dim myinternal(n) As TextBox
Dim mysundrycost(n) As TextBoxFor i = 0 To n
myexternal(i) = New TextBox
myinternal(i) = New TextBox
mysundrycost(i) = New TextBoxDim BudgetEntryRow As New TableRow
Dim ExternalPaymentCell As New TableCell
ExternalPaymentCell.BorderColor = Drawing.Color.DodgerBlue
ExternalPaymentCell.Controls.Add(myexternal(i))
BudgetEntryRow.Cells.Add(ExternalPaymentCell)myexternal(i).ID="MyExternal" & i
・
・
・
項目が3つあるので以上の様に3つのセルを作りTextBoxを加える
・
BudgetEntryTable.Rows.Add(BudgetEntryRow)
【Button2クリックイベントハンドラのコード】
Dim MyExternal(n) As TextBox
Dim MyInternal(n) As TextBox
Dim MySundry(n) As TextBox
Dim n As Integer=Session("n")Dim i As Integer
For i = 0 To n
MyExternal(i) = CType(BudgetEntryTable.FindControl("MyExternal" & i), TextBox)MyInternal(i) = CType(BudgetEntryTable.FindControl("MyInternal" & i), TextBox)
MySundry(i).Text = Ctype(BudgetEntryTable.FindControl("MySundry" & i),TextBox)
Next以上がコードです。よろしくお願い致します。
-
動的にコントロールを生成する場合、ポストバックを考慮して、コントロールの生成は Page.OnInit メソッドでおこなう必要があります。(ViewState などの設定のタイミング等々)
※これは UpdatePanel 等の AJAX 関連とは関係なく、通常の ASP.NET Web アプリケーションでも同じです。
とりあえず、DropDownList で回数を指定するとのことですので、テーブルの行数は固定値で問題なさそうですので、以下のコードを参考にしてください。
Code SnippetDim rowMax As Integer = 9
Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
MyBase.OnInit(e)Dim myexternal(rowMax) As TextBox
For i As Integer = 0 To rowMax
myexternal(i) = New TextBox
Dim BudgetEntryRow As New TableRow
Dim ExternalPaymentCell As New TableCellExternalPaymentCell.BorderColor = Drawing.Color.DodgerBlue
ExternalPaymentCell.Controls.Add(myexternal(i))
BudgetEntryRow.Cells.Add(ExternalPaymentCell)myexternal(i).ID = "MyExternal" & i
BudgetEntryRow.Visible = False
BudgetEntryTable.Rows.Add(BudgetEntryRow)
NextEnd Sub
Protected Sub Button1_Click( ...(中略)... ) Handles Button1.Click
For i As Integer = 0 To rowMax
BudgetEntryTable.Rows(i).Visible = False
NextDim rowNum As Integer = DropDownList1.SelectedValue
For i As Integer = 0 To rowNum - 1
Dim tb As TextBox = CType(BudgetEntryTable.FindControl("MyExternal" & i), TextBox)
tb.Text = "This is " & tb.ID
BudgetEntryTable.Rows(i).Visible = True
NextEnd Sub
Protected Sub Button2_Click( ...(中略)... ) Handles Button2.Click
Dim rowNum As Integer = DropDownList1.SelectedValue
For i As Integer = 0 To rowNum - 1
Dim tb As TextBox = CType(BudgetEntryTable.FindControl("MyExternal" & i), TextBox)...
Next
End Sub