ASP.net (VB.Net) Динамические элементы управления на Pageload и чтение их значений при нажатии кнопки - PullRequest
0 голосов
/ 23 октября 2018

Я создаю страницу с динамическими элементами управления (также задаю ID элементов управления) в таблице на основе цикла в событии загрузки страницы.

Мне нужно получить доступ к значениям этих динамических элементов управления, чтобы сохранить их в базе данных в случае нажатия кнопки.Теперь, когда я зацикливаюсь на таблице, она дает мне 0 строк таблицы.Во-вторых, я также пытаюсь использовать свойство Find_Control, чтобы найти элементы управления на странице, и оно не дает мне НИЧЕГО для каждого элемента управления.

Есть ли что-то, чего мне не хватает, например runat = server?Или есть другой подход для доступа к этим элементам управления при нажатии кнопки.

Код ASP.net ниже

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_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:Table ID="Table1" runat="server">
                </asp:Table>
            </div>
            <asp:Button ID="Button1" runat="server" Text="Button" />
        </form>
    </body>
</html>

Ниже VB.net (просто цикл 10 раз, нечетные строки с текстомполя, четные строки с выпадающим списком в качестве примера)

Option Strict On
Option Explicit On

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        If IsPostBack = False Then
            Dim li As Integer = 0, lj As Integer = 0
            For li = 0 To 9
                Dim loR As New TableRow
                '-------------------------------
                Dim loC1 As New TableCell
                loC1.Text = "Caption " & CStr(li + 1).PadLeft(2, CChar("0")) & " :"
                loR.Cells.Add(loC1)
                '-------------------------------
                Dim loC2 As New TableCell
                Select Case (li + 1) Mod 2
                    Case 0
                        Dim loDD As New DropDownList
                        loDD.ID = "ctl" & CStr(li + 1).PadLeft(2, CChar("0"))
                        For lj = 0 To li + 3
                            loDD.Items.Add("List " & CStr(li + 1).PadLeft(2, CChar("0")) & " : Value " & CStr(lj + 1).PadLeft(2, CChar("0")))
                        Next
                        loC2.Controls.Add(loDD)
                    Case 1
                        Dim loT As New TextBox
                        loT.ID = "ctl" & CStr(li + 1).PadLeft(2, CChar("0"))
                        loC2.Controls.Add(loT)
                End Select
                loR.Cells.Add(loC2)
                '-------------------------------
                Table1.Rows.Add(loR)
            Next
        End If
    End Sub

    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim li As Integer = 0
        For li = 0 To Table1.Rows.Count - 1
            Response.Write("")
        Next
    End Sub

End Class

1 Ответ

0 голосов
/ 23 октября 2018

Привет для хранения и извлечения значений из динамически созданного элемента управления, нам нужно выполнить 3 шага,

1) создать динамические элементы управления в соответствии с нашей потребностью 2) переопределить два метода viewstate, которые LoadViewState и SaveViewState согласно приведенному ниже фрагменту моего кода

protected void CreateDynamicTextBox()
{
    Label lableVendorName = new Label();
    lableVendorName.Text = "Vendor Name";

    TextBox VendorName = new TextBox();
    VendorName.ID = "VendorName";

    PanelVendor.Controls.Add(lableVendorName);
    PanelVendor.Controls.Add(VendorName);
} 


protected override void LoadViewState(object savedState)
        {
            //if we can identify the custom view state as defined in the override for SaveViewState
            if (savedState is object[] && ((object[])savedState).Length == 2 && ((object[])savedState)[0] is string[])
            {
                object[] newViewState = (object[])savedState;
                string[] txtValues = (string[])(newViewState[0]);
                if (txtValues.Length > 0)
                {
                    CreateDynamicTextBox();
                    (PanelVendor.FindControl("VendorName") as TextBox).Text = txtValues[0];
                }
                //load the ViewState normally
                base.LoadViewState(newViewState[1]);
            }
            else
            {
                base.LoadViewState(savedState);
            }
        }

protected override object SaveViewState()
{
    object[] newViewState = new object[2];
    List<string> txtValues = new List<string>();
    if (PanelVendor.Controls.Count > 1)
    {
        txtValues.Add((PanelVendor.FindControl("VendorName") as TextBox).Text);
    }

    newViewState[0] = txtValues.ToArray();
    newViewState[1] = base.SaveViewState();
    return newViewState;
}

и теперь извлекаем значение из этого элемента управления, как показано ниже

protected void btnItem_Click(object sender, EventArgs e)
        {
string VendorName = (PanelVendor.FindControl("VendorName") as TextBox).Text;
}

, надеюсь, это поможет.счастливое кодирование:)

...