获取在PageLoad/Init-ASP.NET之后创建的动态创建控件的值
我有一个带有表单的面板,它有一个值为1-10的下拉列表。按下面板上的按钮时,该面板不可见,第二个面板可见。在第二个面板上,我动态生成了多行控件。行数由下拉列表中的selecteditem确定 我的问题是,当我想执行验证并存储动态创建的控件内容的值时,这些控件会被删除 我知道这与页面的生命周期和动态创建控件的持久性有关,但我不知道如何解决这个问题。我在这里读过许多其他类似的问题,很少有人有解决这个问题的工作实例,所以我一点也不聪明。这包括需要在pageload或pageinit上创建动态创建的控件的建议,这怎么可能,因为我们不知道要创建多少控件 重述一下:这些控件在页面加载时不会添加,这些控件仅在用户按下按钮后添加。我们不知道要制作多少控件,直到用户选择了他们想要的数量 到目前为止,我的代码是:获取在PageLoad/Init-ASP.NET之后创建的动态创建控件的值,asp.net,vb.net,postback,viewstate,Asp.net,Vb.net,Postback,Viewstate,我有一个带有表单的面板,它有一个值为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/which中保存一个变量,如果将它们命名为与前一个状态相同的名称,那么viewstate将被恢复 有关详细信息,请查看以下链接:
请将您的代码范围缩小到仅适用于相关代码。问题是我取了用户在下拉列表中选择的数字,创建了那么多行文本框。当我试图保存他们在这些文本框中输入的内容时,会出现“对象引用未设置为对象实例”错误。我认为这是因为,只要按下试图从文本框中检索值的按钮,这些框就会消失。如何从这些文本框中获取值?在
Page\u Load
中调用createtextboxs
。如何知道要创建多少个?它可以是一行5个文本框,也可以是10行。这仅在用户选择并提交按钮后决定。使用最新更改编辑您的代码,并删除所有不相关的代码。这样,更多的人可能会看到它并帮助你。