Сохраните значение динамически созданного текстового поля.

ОБНОВЛЕНИЕ 1: я изучаю эту ссылку. Сохранение динамически созданных элементов управления во время PostBack — VB.net Это может объяснить то, что мне нужно знать. В комментарии по ссылке выше упоминается воссоздание элемента управления с использованием того же идентификатора. ASP.net автоматически сохранит это значение. Затем я смогу найти элемент управления и получить введенное значение. .. Благодарность ..

ОБНОВЛЕНИЕ 2: благодаря комментарию Win ниже и ссылке выше, я думаю, что понял это. Подтвердить и опубликовать ответ позже.

Я должен извиниться, кажется, что есть тысяча подобных вопросов. Но после прочтения многих вопросов и ответов я все еще не могу заставить свою простую страницу работать. Я очень новичок в этом. Пожалуйста, позвольте мне задать этот вопрос еще раз.

У меня есть очень простая страница ASPX с одним раскрывающимся списком, таблицей и одной кнопкой. Выпадающий список заполняется с использованием таблицы данных (таблица данных из таблицы SQL). таблица используется для контейнера динамически создаваемого текстового поля. и кнопка для обновления. ниже мой фрагмент кода для кода ASPX и vb.net позади

Проблема, с которой я столкнулся, заключается в том, что page.findcontrol не может найти элемент управления, который был создан динамически. Я смутно понимаю, что это проблема из-за обратной отправки, page_load vs page_init. но у меня все еще нет полного понимания после всех руководств, которые я прочитал :( .. не могли бы вы помочь, как заставить это работать?

Спасибо огромное

Дополнительная информация: я все равно пытался сделать то, что предлагается в комментарии, и я воссоздаю элемент управления при загрузке или инициализации страницы, но какое значение будет в текстовом поле при его повторном создании? вот поток, который видит пользователь.

  1. step0 При первой загрузке страницы еще нет динамического текстового поля
  2. Step1 пользователь выбирает значение 34
  3. step2 autopostback selectedindexchanged запущен, и значение 34 передано обратно на сервер и возвращено 2 имени joe и jack, создается динамическое textbox_1 с joe и динамическое textbox_2 с jack.
  4. Step3 пользователь ввел значение jane в textbox_1. и нажмите кнопку 1.
  5. Событие нажатия кнопки Step4 button1 запущено, и я пытаюсь захватить слово jane в 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>

ВБ.нет

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

Примечание. Событие нажатия кнопки 1 не завершено. но как только я смогу понять, как фиксировать данные, вводимые в текстовое поле, я смогу сделать все остальное. Моя основная проблема заключается в том, что я не могу получить значение txtEmployee_1 и не могу найти элементы управления. Кажется, я использовал findcontrol в неподходящее время или инициализировал элемент управления в неподходящее время.

А это мой стол

╔════════════╦══════════════╦════════════╗
║  LastName  ║ DepartmentID ║ EmployeeID ║
╠════════════╬══════════════╬════════════╣
║ Rafferty   ║           31 ║          1 ║
║ Jones      ║           33 ║          2 ║
║ Heisenberg ║           33 ║          3 ║
║ Robinson   ║           34 ║          4 ║
║ Smith      ║           34 ║          5 ║
╚════════════╩══════════════╩════════════╝

person BobNoobGuy    schedule 30.12.2014    source источник
comment
Возможно, вы захотите взглянуть на этот ответ, на который я ответил несколько часов назад.   -  person Win    schedule 30.12.2014
comment
но я хочу сохранить значение, введенное внутри динамического элемента управления, если я воссоздам элемент управления, значение из базы данных снова заполнит текстовое поле. Моя проблема в том, что я не могу найти элемент управления, чтобы получить значение в текстовом поле. Я не знаю, когда найти элемент управления, чтобы получить текстовое поле, которое я ищу   -  person BobNoobGuy    schedule 30.12.2014
comment
Я все равно попробовал то, что вы предлагаете, поэтому, если я воссоздам элемент управления при загрузке или инициализации страницы, какое значение будет в текстовом поле? вот поток, который видит пользователь. step 1 Пользователь выбирает значение 34 step2, значение 34 передается обратно на сервер и возвращает 2 имени joe и jack, создается динамическое textbox_1 с joe и динамическое textbox_2 с jack. Step3 пользователь изменяет значение joe в textbox_1 на jane. и нажмите кнопку 1. Шаг 4. Я пытаюсь уловить слово jane, но не могу. потому что я не могу найти элемент управления textbox_1 из-за времени или моих ограниченных знаний. вот где мне нужна помощь. Благодарность   -  person BobNoobGuy    schedule 30.12.2014
comment
Для этого сценария вы хотите использовать GridView (или аналогичный элемент управления данными) вместо asp:Table.   -  person Win    schedule 31.12.2014


Ответы (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. Используйте свой словарь и имя идентификатора элемента управления, чтобы найти его, и направьте его на нужный тип элемента управления.
  4. Делайте все, что вам нужно, с данными из элементов управления. Вы упомянули текстовые поля, поэтому вы должны использовать свойство .Text вашего приведенного элемента управления.
  5. Если вы закончили работу с элементом управления, вы можете удалить его из коллекции элементов управления страницы. Обновите любую логику, которую вы использовали, чтобы больше не создавать текстовое поле.
person Gabe    schedule 01.01.2015

Я решил это, используя

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
person BobNoobGuy    schedule 23.01.2015