【发布时间】:2015-02-26 04:00:49
【问题描述】:
UPDATE1:我正在调查此链接。 Retaining dynamically created controls during PostBack - VB.net 它可以解释我需要知道的。上面链接中的注释提到使用相同的 ID 重新创建控件。 ASP.net 将自动保留该值。然后我将能够找到控件并获取键入的值。 ..谢谢..
UPDATE2:感谢 Win 在下面的评论和上面的链接,我想我明白了。稍后将确认并发布答案。
我必须道歉,似乎有一千个类似的问题。但是在阅读了许多问答之后,我似乎仍然无法让我的简单页面正常工作。我对此很陌生。请允许我再问一次。
我有一个非常简单的 ASPX 页面,其中包含一个下拉列表、一个表格和一个按钮。 使用数据表填充下拉列表(数据表来自 SQL 表)。该表用于动态创建的文本框的容器。和一个按钮来进行更新。 下面是我的 ASPX 和 vb.net 代码的 sn-p 代码
我面临的问题是 page.findcontrol 无法找到动态创建的控件。我隐约明白这是由于回发,page_load vs page_init造成的问题。但是在我阅读了所有教程之后,我仍然没有完全理解:( ..你能帮我解决这个问题吗?
非常感谢
额外信息: 无论如何,我尝试执行评论中的建议,并在页面加载或初始化时重新创建控件,但是当我重新创建它时文本框中的值是什么?这是用户看到的流程。
- step0 页面第一次加载,还没有动态文本框
- Step1用户选择值34
- step2 自动回发 selectedindexchanged 已触发并且值 34 已通过 返回服务器并返回 2 个名称 joe 和 jack,它创建 带有 joe 的动态 textbox_1 和带有 jack 的动态 textbox_2。
- Step3 用户在 textbox_1 中键入值 jane。和 点击按钮1。
- Step4 button1 click 事件已触发,我正在尝试捕获单词 简在 textbox_1 但我不能。因为我找不到控制 textbox_1 由于时间或我的知识有限。这是我的地方 需要帮助。
ASPX
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True">
</asp:DropDownList>
<br />
<br />
<asp:Table ID="Table1" runat="server">
</asp:Table>
<br />
<asp:Button ID="Button1" runat="server" Text="Button" />
</div>
</form>
</body>
VB.net
Imports System.Data.SqlClient
Public Class DynamicControl
Inherits System.Web.UI.Page
Dim connString As String = "Server=Local;Database=SampleData;Trusted_Connection=True;Max Pool Size=1000"
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
getData()
End If
End Sub
Private Sub getData()
Dim dt As New DataTable
Dim SQLString As String
Dim conn As New SqlConnection
conn.ConnectionString = connString
conn.Open()
SQLString = "select DepartmentID from Employee where departmentid is not null group by departmentid"
getDataBySQLConn(SQLString, dt, conn)
DropDownList1.DataSource = dt
DropDownList1.DataValueField = "DepartmentID"
DropDownList1.DataTextField = "DepartmentID"
DropDownList1.DataBind()
End Sub
Protected Sub DropDownList1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles DropDownList1.SelectedIndexChanged
Dim dt As New DataTable
Dim SQLString As String
Dim conn As New SqlConnection
conn.ConnectionString = connString
conn.Open()
SQLString = "select employeeid,lastname from Employee where departmentid =" & DropDownList1.SelectedValue.ToString
getDataBySQLConn(SQLString, dt, conn)
For Each rows As DataRow In dt.Rows
Dim tTextBox As New TextBox
Dim tr As New TableRow
Dim tc As New TableCell
tTextBox.ID = "txtEmployee_" & rows("EmployeeID")
tTextBox.Text = rows("lastname")
tr.Cells.Add(tc)
tc.Controls.Add(tTextBox)
Table1.Rows.Add(tr)
Next
End Sub
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'Update Employee set lastname = '' where employeeID = 2
Dim iEmployeeID As Integer
Dim sLastName As String
Dim tTextBox As TextBox
iEmployeeID = DirectCast(Page.FindControl("txtEmployee_1"), TextBox).ToString
tTextBox = Page.FindControl("txtEmployee_1")
sLastName = tTextBox.Text
End Sub
End Class
注意:button1 点击事件不完整。但是一旦我弄清楚如何捕获在文本框中输入的数据,我就可以完成其余的工作。我的主要问题是我无法获取 txtEmployee_1 的值,也无法找到控件。我好像是在错误的时间使用了findcontrol,或者在错误的时间初始化了控件。
这是我的桌子
╔════════════╦══════════════╦════════════╗
║ LastName ║ DepartmentID ║ EmployeeID ║
╠════════════╬══════════════╬════════════╣
║ Rafferty ║ 31 ║ 1 ║
║ Jones ║ 33 ║ 2 ║
║ Heisenberg ║ 33 ║ 3 ║
║ Robinson ║ 34 ║ 4 ║
║ Smith ║ 34 ║ 5 ║
╚════════════╩══════════════╩════════════╝
【问题讨论】:
-
你可能想看看我几个小时前回答的this answer。
-
但我想保留在动态控件中键入的值,如果我重新创建控件,数据库中的值将再次填充文本框。我的问题是我找不到控件以获取文本框中的值。我不知道什么时候找到控件才能得到我要找的文本框
-
无论如何我都尝试了你的建议,所以如果我在页面加载或初始化时重新创建控件,文本框中的值是多少?这是用户看到的流程。步骤 1 用户选择值 34 step2,值 34 传回服务器并返回 2 个名称 joe 和 jack,它使用 joe 创建动态 textbox_1 和使用 jack 的动态 textbox_2。 Step3 用户将 textbox_1 中的值 joe 更改为 jane。并单击按钮 1。第 4 步我试图捕捉单词 jane 但我不能。因为由于时间或知识有限,我找不到控件 textbox_1。这就是我需要帮助的地方。谢谢
-
对于这种情况,您希望使用 GridView (或类似的数据控件) 而不是 asp:Table。
标签: asp.net vb.net postback dynamically-generated