0

1〜10の値のドロップダウンリストがあるフォームのパネルがあります。パネルのボタンを押すと、そのパネルが非表示になり、2番目のボタンが表示されます。2番目のパネルには、動的に生成されるコントロールの行があります。行数は、ドロップダウンリストで選択した項目によって決まります。

私の問題は、検証を実行してから、動的に作成されたコントロールのコンテンツの値を保存したいときに、コントロールが削除されることです。

これはページのライフサイクルと動的に作成されたコントロールの永続性に関係していることを理解していますが、問題を回避する方法がわかりません。私はここで他の多くの同様の質問を読みました、そしてこれを誰が解決するかについての実用的な例を持っている人はほとんどいないので、私は賢明ではありません。これには、動的に作成されたコントロールをpageloadまたはpageinitで作成する必要があるという提案が含まれますが、いくつ作成するかわからないので、どうすればよいでしょうか。

要約すると、これらのコントロールはページの読み込み時に追加されません。これらのコントロールは、ユーザーがボタンを押した後にのみ追加されます。ユーザーが必要な数を選択するまで、いくつのコントロールを作成するかはわかりません。

これまでの私のコード:

Partial Class View
Inherits SeatPlannerModuleBase
Implements IActionable
Dim valid As String = "success"

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load, Me.Load
    Try

        Dim n As Integer = 0

        ' now, create n TextBoxes, adding them to the PlaceHolder TextBoxesHere
        For i As Integer = 0 To n - 1
            res_Placeholder.Controls.Add(New Label())
            booking_Placeholder.Controls.Add(New Label())

            title_Placeholder.Controls.Add(New TextBox())
            firstname_Placeholder.Controls.Add(New TextBox())
            surname_Placeholder.Controls.Add(New TextBox())
            ticketNum_Placeholder.Controls.Add(New TextBox())

        Next

        ' now, set the Text property of each TextBox
        IterateThroughBooking(Me)
        IterateThroughReservation(Me)
        IterateThroughTitle(Me)
        IterateThroughFirstname(Me)
        IterateThroughSurname(Me)
        IterateThroughTicketNum(Me)

        If Not Page.IsPostBack Then

        End If

    Catch exc As Exception        'Module failed to load
        ProcessModuleLoadException(Me, exc)
    End Try
End Sub

Protected Sub IterateThroughTitle(ByVal parent As Control)
    Dim count As Integer = 1

    For Each c As Control In title_Placeholder.Controls
        If c.[GetType]().ToString().Equals("System.Web.UI.WebControls.TextBox") AndAlso c.ID Is Nothing Then
            'DirectCast(c, TextBox).Text = "TextBox_Title " + count.ToString()
            DirectCast(c, TextBox).ID = "TextBox_Title_" + count.ToString()
            DirectCast(c, TextBox).CssClass = "DYN_TextBox"
            count += 1
        End If

        If c.Controls.Count > 0 Then
            IterateThroughTitle(c)
        End If
    Next
End Sub

Protected Sub CreateTextBoxes()

    Dim n As Integer = number_of_tickets_Ddl.SelectedValue

    ' now, create n TextBoxes, adding them to the PlaceHolder TextBoxesHere
    For i As Integer = 0 To n - 1
        res_Placeholder.Controls.Add(New Label())
        booking_Placeholder.Controls.Add(New Label())

        title_Placeholder.Controls.Add(New TextBox())
        firstname_Placeholder.Controls.Add(New TextBox())
        surname_Placeholder.Controls.Add(New TextBox())
        ticketNum_Placeholder.Controls.Add(New TextBox())

    Next

    ' now, set the Text property of each TextBox
    IterateThroughBooking(Me)
    IterateThroughReservation(Me)
    IterateThroughTitle(Me)
    IterateThroughFirstname(Me)
    IterateThroughSurname(Me)
    IterateThroughTicketNum(Me)

    Retreive_first_row()

End Sub

Protected Sub next_submit_Btn_Click(ByVal sender As Object, ByVal e As EventArgs) Handles next_submit_Btn.Click

    Step1_Pnl.Visible = False
    Step2_Pnl.Visible = True
    CreateTextBoxes()
    Button1.Attributes.Add("OnClick", "validate_step2(); return false;")

End Sub

Protected Sub next_submit2_Btn_Click(ByVal sender As Object, ByVal e As EventArgs) Handles next_submit2_Btn.Click

    step2_error_Lbl.Text = CType(Me.FindControl("TextBox_Title_2"), TextBox).Text

End Sub

End Class       
4

1 に答える 1

0

動的に作成されたコントロールは、ポストバック後も保持されません。毎回再作成する必要があります。これは技術的な制限です。作成するコントロールの数を知るには、セッション/ビューステートなどに変数を保存できます。前の状態と同じように名前を付けると、ビューステートは復元されます。

詳細については、次のリンクを確認してください。

http://weblogs.asp.net/infinitiesloop/archive/2006/08/25/TRULY-Understanding-Dynamic-Controls-_2800_Part-1_2900_.aspx

ASP.NETは動的に作成されたコントロールとポストバック

于 2012-08-20T18:42:25.383 に答える