首页 > 解决方案 > ASP.net (VB.Net) Pageload 上的动态控件并在按钮单击时读取它们的值

问题描述

我正在基于页面加载事件中的循环在表中创建一个带有动态控件(也设置控件 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

标签: asp.netvb.netdynamic-controls

解决方案


嗨,为了从动态创建的控件中存储和检索值,我们需要遵循 3 个步骤,

1)根据我们的需要创建动态控件 2)根据我的代码片段覆盖视图状态的两个方法,即LoadViewStateSaveViewState

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;
}

希望这会有所帮助。快乐编码:)


推荐阅读