簡體   English   中英

在回發期間保留動態創建的控件-VB.net

[英]Retaining dynamically created controls during PostBack - VB.net

我有一個面板,該面板的表單包含一個值為1-10的下拉列表。 當按下面板上的按鈕時,該面板將變為不可見,第二個面板將變為可見。 在第二個面板上,我有動態生成的控件行。 行數由下拉列表中的selecteditem確定。

我的問題是,當我要進行驗證然后存儲動態創建的控件內容的值時,這些控件將被刪除。

我知道這與頁面的生命周期和動態創建的控件的持久性有關,但是我不知道解決該問題的方法。 我在這里閱讀了許多其他類似的問題,很少有人提供解決該問題的有效示例,因此我認為這不是明智的選擇。 這包括建議動態創建的控件需要在pageload或pageinit上創建的建議,由於我們不知道要制作多少控件,這怎么可能?

一如既往,任何幫助都將不勝感激。

Imports DotNetNuke.Entities.Modules
Imports DotNetNuke
Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Collections.Generic
Imports System.Reflection
Imports System.Web.Configuration
Imports System.Net.Mail
Imports System.Data.SqlClient

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

        If Not Page.IsPostBack Then

        End If

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

Public ReadOnly Property ModuleActions() As Entities.Modules.Actions.ModuleActionCollection Implements Entities.Modules.IActionable.ModuleActions
    Get
        Dim Actions As New Entities.Modules.Actions.ModuleActionCollection
        Actions.Add(GetNextActionID, Localization.GetString(Entities.Modules.Actions.ModuleActionType.AddContent, LocalResourceFile), Entities.Modules.Actions.ModuleActionType.AddContent, "", "", EditUrl(), False, DotNetNuke.Security.SecurityAccessLevel.Edit, True, False)
        Return Actions
    End Get
End Property

Protected Sub Filldata()
    Dim conn As New SqlConnection()
    conn.ConnectionString = WebConfigurationManager.ConnectionStrings("Congress_SeatPlanner_ConnectionString").ConnectionString
    Dim Qstr As String = "select * From [Seat_planner_2013].[dbo].[booking]"
    Try
        Using connection As New SqlConnection(conn.ConnectionString)
            connection.Open()
            Dim command As New SqlCommand(Qstr, connection)
            Dim reader As SqlDataReader = command.ExecuteReader()
            If reader.Read() Then
                Try
                    Dim title As String

                    title = reader("title")
                    title = title.Trim
                    title_Txt.Text = title
                Catch
                    title_Txt.Text = ""
                End Try
                Try
                    first_name_Txt.Text = reader("first_name")
                Catch
                    first_name_Txt.Text = ""
                End Try
                Try
                    surname_Txt.Text = reader("surname")
                Catch
                    surname_Txt.Text = ""
                End Try
                Try
                    company_name_Txt.Text = reader("company_name")
                Catch
                    company_name_Txt.Text = ""
                End Try
                Try
                    contact_number_Txt.Text = reader("contact_phone")
                Catch
                    contact_number_Txt.Text = ""
                End Try
                Try
                    contact_email_Txt.Text = reader("contact_email")
                Catch
                    contact_email_Txt.Text = ""
                End Try
                Try
                    number_of_tickets_Ddl.SelectedValue = reader("number_of_tickets")
                Catch
                    number_of_tickets_Ddl.SelectedValue = ""
                End Try
                Try
                    purchase_date_Txt.Text = reader("date_of_purchase")
                Catch
                    purchase_date_Txt.Text = ""
                End Try
            End If
        End Using
    Catch ex As Exception
        ErrLabel_Lbl.Visible = True
        ErrLabel_Lbl.Text = ex.Message.ToString
    End Try
End Sub

Protected Sub validate()

    If title_Txt.Text.Length < 2 Then
        title_error_Lbl.Text = "Please enter a title"
        valid = "fail"
    Else
        title_error_Lbl.Text = "*"
    End If
    If first_name_Txt.Text.Length < 1 Then
        first_name_error_Lbl.Text = "Please enter a first name"
        valid = "fail"
    Else
        first_name_error_Lbl.Text = "*"
    End If
    If surname_Txt.Text.Length < 1 Then
        surname_error_Lbl.Text = "Please enter a surname"
        valid = "fail"
    Else
        surname_error_Lbl.Text = "*"
    End If
    If company_name_Txt.Text.Length < 1 Then
        comnpany_name_error_Lbl.Text = "Please enter a company name"
        valid = "fail"
    Else
        comnpany_name_error_Lbl.Text = "*"
    End If
    If contact_email_Txt.Text.Length < 1 Then
        contact_email_error_Lbl.Text = "Please enter a contact email address"
        valid = "fail"
    Else
        contact_email_error_Lbl.Text = "*"
    End If
    If contact_number_Txt.Text.Length < 1 Then
        contact_phone_error_Lbl.Text = "Please enter a contact phone number"
        valid = "fail"
    Else
        contact_phone_error_Lbl.Text = "*"
    End If
    If number_of_tickets_Ddl.SelectedValue = "Please select" Then
        number_of_tickets_error_Lbl.Text = "Please select a number of tickets to allocate"
        valid = "fail"
    Else
        number_of_tickets_error_Lbl.Text = "*"
    End If
    If purchase_date_Txt.Text.Length < 1 Then
        date_of_purchase_error_Lbl.Text = "Please enter the date you purchased the tickets"
        valid = "fail"
    Else
        date_of_purchase_error_Lbl.Text = "*"
    End If

    If valid = "fail" Then
        ErrLabel_Lbl.Text = "Failed validation"
    Else
        ErrLabel_Lbl.Text = "Validation succeeded"
    End If

End Sub

Protected Sub validate_step2()

'validation here that doesn't work due to the postback issue

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 IterateThroughFirstname(ByVal parent As Control)
    Dim count As Integer = 1

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

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

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

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

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

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

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

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

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

    For Each c As Control In booking_Placeholder.Controls
        If c.[GetType]().ToString().Equals("System.Web.UI.WebControls.Label") AndAlso c.ID Is Nothing Then
            DirectCast(c, Label).Text = "Booking #" + count.ToString()
            DirectCast(c, Label).ID = "BookLabel_" + count.ToString()
            DirectCast(c, Label).CssClass = "DYN_Label"
            count += 1
        End If

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

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

    For Each c As Control In res_Placeholder.Controls
        If c.[GetType]().ToString().Equals("System.Web.UI.WebControls.Label") AndAlso c.ID Is Nothing Then
            DirectCast(c, Label).Text = "Guest"
            DirectCast(c, Label).ID = "ResLabel_" + count.ToString()
            DirectCast(c, Label).CssClass = "DYN_Label"
            count += 1
        End If

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

Protected Sub Retreive_first_row()

    CType(Me.FindControl("ResLabel_1"), Label).Text() = "You"
    CType(Me.FindControl("TextBox_Title_1"), TextBox).Text() = title_Txt.Text
    CType(Me.FindControl("TextBox_Title_1"), TextBox).Enabled() = False
    CType(Me.FindControl("TextBox_Firstname_1"), TextBox).Text() = first_name_Txt.Text
    CType(Me.FindControl("TextBox_Firstname_1"), TextBox).Enabled() = False
    CType(Me.FindControl("TextBox_Surname_1"), TextBox).Text() = surname_Txt.Text
    CType(Me.FindControl("TextBox_Surname_1"), TextBox).Enabled() = False

End Sub

Protected Sub CreateTextBoxes()

    If Not Page.IsValid Then
        Return
    End If

    Dim n As Integer = number_of_tickets_Ddl.SelectedValue

    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

    IterateThroughBooking(Me)
    IterateThroughReservation(Me)
    IterateThroughTitle(Me)
    IterateThroughFirstname(Me)
    IterateThroughSurname(Me)
    IterateThroughTicketNum(Me)

    Retreive_first_row()

End Sub

Protected Sub testconn_submit_Btn_Click(ByVal sender As Object, ByVal e As EventArgs) Handles testconn_submit_Btn.Click

    Filldata()

End Sub

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

    validate()

    If valid = "fail" Then

    Else

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

End Sub

Protected Sub clear_submit_Btn_Click(ByVal sender As Object, ByVal e As EventArgs) Handles clear_submit_Btn.Click

    title_Txt.Text = ""
    first_name_Txt.Text = ""
    surname_Txt.Text = ""
    company_name_Txt.Text = ""
    contact_number_Txt.Text = ""
    contact_email_Txt.Text = ""
    number_of_tickets_Ddl.SelectedValue = "Please select"
    purchase_date_Txt.Text = ""

    title_error_Lbl.Text = "*"
    first_name_error_Lbl.Text = "*"
    surname_error_Lbl.Text = "*"
    comnpany_name_error_Lbl.Text = "*"
    contact_phone_error_Lbl.Text = "*"
    contact_email_error_Lbl.Text = "*"
    number_of_tickets_error_Lbl.Text = "*"
    date_of_purchase_error_Lbl.Text = "*"

End Sub

Protected Sub back_Btn_Click(ByVal sender As Object, ByVal e As EventArgs) Handles back_Btn.Click

    Step1_Pnl.Visible = True
    Step2_Pnl.Visible = False

End Sub

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

    validate_step2()

End Sub

End Class

通常,在創建動態控件時,可以在Page_Init創建控件,並設置事件處理程序和所有初始屬性(即ID,名稱,樣式,文本等)。 當發生回發時,ViewState將在Page_Init之后應用(假設ViewState已打開)。

在這種情況下,我將更改為中繼器或某種數據網格控件,並使用數據綁定來填充它。 可以將中繼器控件本質上綁定到數字數組,從而將模板重復X次。

在這里可以找到使用中繼器執行此操作的完美示例: VB.NET中繼器沒有數據源的簡單數據綁定

用戶首次在下拉菜單中選擇一個項目時,您將獲得計數並創建動態控件。 訣竅在於記住下一次PostBack的計數。

您可以為此使用會話來記住此計數。

現在,當您收到第二個PostBack ,可以在Init上重新創建控件。 如果希望這些動態創建的控件接收事件,則Load為時已晚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM