[英]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.