获取在PageLoad/Init之后创建的动态创建控件的值-ASP.NET



我有一个面板,它有一个值为1-10的下拉列表。当按下面板上的一个按钮时,该面板将变为不可见,第二个面板变为可见。在第二个面板上,我有动态生成的控件行。行数由下拉列表中的selecteditem决定。

我的问题是,当我想执行验证,然后存储动态创建的控件的内容值时,这些控件会被删除。

我知道这与页面的生命周期和动态创建的控件的持久性有关,但我不知道如何解决这个问题。我在这里读过很多其他类似的问题,很少有人能举例说明谁来解决这个问题,所以我一点也不知道。这包括需要在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       

动态创建的控件在回发后不会持久存在,每次都必须重新创建它们,这是技术限制。要知道创建了多少控件,您可以将变量保存在session/viewstate/whathing中,如果您像以前的状态一样命名它们,则视图状态将被恢复。

查看这些链接了解更多信息:

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

ASP.NET动态创建控件和Postback

最新更新