【问题标题】:Save the value of Dynamically created textbox保存动态创建的文本框的值
【发布时间】: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造成的问题。但是在我阅读了所有教程之后,我仍然没有完全理解:( ..你能帮我解决这个问题吗?

非常感谢

额外信息: 无论如何,我尝试执行评论中的建议,并在页面加载或初始化时重新创建控件,但是当我重新创建它时文本框中的值是什么?这是用户看到的流程。

  1. step0 页面第一次加载,还没有动态文本框
  2. Step1用户选择值34
  3. step2 自动回发 selectedindexchanged 已触发并且值 34 已通过 返回服务器并返回 2 个名称 joe 和 jack,它创建 带有 joe 的动态 textbox_1 和带有 jack 的动态 textbox_2。
  4. Step3 用户在 textbox_1 中键入值 jane。和 点击按钮1。
  5. 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


【解决方案1】:

我通过使用解决了这个问题

For Each s As String In Request.Params

代替

DirectCast(Page.FindControl("txtEmployee_1"), TextBox).ToString

使用 Request.Params 我可以捕获用户键入的内容

For Each s As String In Request.Params
  If s.contains(txtEmployee_1) THEN txtUserTyped = Request(s)
Next

【讨论】:

    【解决方案2】:

    我正在我正在开发的应用程序中做类似的事情。让我举一个我认为会有所帮助的非常简单的例子:

    Default.aspx:

    <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="WebApplication3._Default" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Button ID="Button1" runat="server" Text="Make textbox" />
            <asp:Button ID="Button2" runat="server" Text="Get textbox text" />
        </div>
        </form>
    </body>
    </html>
    

    Default.aspx.vb:

    Public Class _Default
        Inherits System.Web.UI.Page
    
        Protected controlBag As New Dictionary(Of String, Control)
        Protected Const textBox1Name As String = "textBox1"
        Protected Const textBox1EnabledName As String = "textBox1Status"
    
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            If ViewState(textBox1EnabledName) = True Then
                makeTextBox()
            End If
        End Sub
    
        Private Sub makeTextBox()
            Dim x As New TextBox
            x.ID = textBox1Name
            If Not controlBag.ContainsKey(textBox1Name) Then
                form1.Controls.Add(x)
                controlBag.Add(x.ID, x)
            End If
        End Sub
    
        Private Sub removeTextBox()
            If controlBag.ContainsKey(textBox1Name) Then
                form1.Controls.Remove(controlBag(textBox1Name))
            End If
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            ViewState(textBox1EnabledName) = True
            makeTextBox()
        End Sub
    
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Dim x As New Literal
    
            If controlBag.ContainsKey(textBox1Name) Then
                x.Text = String.Format("Here's the text: {0}", DirectCast(controlBag(textBox1Name), TextBox).Text)
                removeTextBox()
    
                ViewState(textBox1EnabledName) = False
            Else
                x.Text = "The textbox does not exist"
            End If
    
            form1.Controls.Add(x)
        End Sub
    End Class
    

    总体思路:

    1. 构建动态控件。将它们添加到页面中,同时也将它们添加到字典中。我使用字典(字符串,控件)。这有助于以后查找他们的数据。您需要添加关于何时创建控件以及将它们绑定到什么的逻辑。
    2. 在回发时,您必须重新创建完全相同的控件,即使您不希望它们出现在最终页面输出中。您必须在访问他们的数据之前执行此操作。将它们添加到页面控件集合中,不要忘记将它们添加到您的字典中。
    3. 使用您的字典和控件 ID 的名称进行查找并将其 DirectCast 为您想要的控件类型。
    4. 对来自控件的数据做任何你需要做的事情。您提到了文本框,因此您将使用已转换控件的 .Text 属性。
    5. 如果您已完成该控件,您可以将其从页面控件集合中删除。更新您用来不再创建文本框的任何逻辑。

    【讨论】:

      猜你喜欢
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多