none
UpdatePanleで作成したコントロールの取得方法 RRS feed

  • 質問

  • こんにちは。Chip'nDaleです。

     

    今回はAjaxのUpdatePanelの事で質問させて頂きたいと思います。

     

    私は現在、Page_Loadイベントで回数を指定してその回数分の行とテキストボックスをテーブルに生成するということをUpdatePanelを使って行っています。行とテキストボックスを表示させるのはすぐに出来ました。

    しかし、Buttonのクリックイベントで、生成したテキストボックスをFindControlを使って取得しようとしてもNothingとなってしまい取得できません。

     

    UpdatePanelを使って生成したコントロールは取得することができないのでしょうか?

     

    どなたか、わかる方がいらっしゃれば教えて頂きたいと思います。よろしくお願い致します。

     

    FindControlでテキストボックスを取得する時のコードを載せておきます↓↓

     

    dim tb as TextBox

     tb= CType(Table1.FindControl("TextBox1"), TextBox)

    2007年8月16日 0:26

回答

  • 動的にコントロールを生成する場合、ポストバックを考慮して、コントロールの生成は Page.OnInit メソッドでおこなう必要があります。(ViewState などの設定のタイミング等々)

    ※これは UpdatePanel 等の AJAX 関連とは関係なく、通常の ASP.NET Web アプリケーションでも同じです。

     

    とりあえず、DropDownList で回数を指定するとのことですので、テーブルの行数は固定値で問題なさそうですので、以下のコードを参考にしてください。

     

    Code Snippet

    Dim 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 TableCell

            ExternalPaymentCell.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)
        Next

    End Sub

     

    Protected Sub Button1_Click( ...(中略)... ) Handles Button1.Click

        For i As Integer = 0 To rowMax
            BudgetEntryTable.Rows(i).Visible = False
        Next

     

        Dim 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
        Next

    End 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

     

     

    2007年8月17日 12:26
  • chack - Akira Inoue さん ありがとうございました。

     

    教えて頂いたコードを参考に修正したところ無事にコントロール及びそのTextプロパティを

    取得することができました。

     

    またわからない事がありましたらお聞きすることになると思いますがよろしくお願い致します。

     

    本当にありがとうございました。


     

    2007年8月20日 0:33

すべての返信

  • おそらく、Page_Load イベントハンドラ内で、動的に UpdatePanel と TextBox を生成しているということだと思いますが、これだけでは、なんとも・・・

     

    最低限、現象が確認できる aspx コードと Page_Load イベントハンドラおよび Button クリックイベントハンドラのコードを提示できませんか?

    2007年8月16日 2:15
  • すいません。こちらの書き込みに誤りがありました。

    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 TextBox

      For i = 0 To n
           myexternal(i) = New TextBox
           myinternal(i) = New TextBox
           mysundrycost(i) = New TextBox

         Dim 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

     

    以上がコードです。よろしくお願い致します。


     

    2007年8月17日 7:27
  • 動的にコントロールを生成する場合、ポストバックを考慮して、コントロールの生成は Page.OnInit メソッドでおこなう必要があります。(ViewState などの設定のタイミング等々)

    ※これは UpdatePanel 等の AJAX 関連とは関係なく、通常の ASP.NET Web アプリケーションでも同じです。

     

    とりあえず、DropDownList で回数を指定するとのことですので、テーブルの行数は固定値で問題なさそうですので、以下のコードを参考にしてください。

     

    Code Snippet

    Dim 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 TableCell

            ExternalPaymentCell.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)
        Next

    End Sub

     

    Protected Sub Button1_Click( ...(中略)... ) Handles Button1.Click

        For i As Integer = 0 To rowMax
            BudgetEntryTable.Rows(i).Visible = False
        Next

     

        Dim 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
        Next

    End 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

     

     

    2007年8月17日 12:26
  • chack - Akira Inoue さん ありがとうございました。

     

    教えて頂いたコードを参考に修正したところ無事にコントロール及びそのTextプロパティを

    取得することができました。

     

    またわからない事がありましたらお聞きすることになると思いますがよろしくお願い致します。

     

    本当にありがとうございました。


     

    2007年8月20日 0:33