asp.net - 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
解决方案
嗨,为了从动态创建的控件中存储和检索值,我们需要遵循 3 个步骤,
1)根据我们的需要创建动态控件 2)根据我的代码片段覆盖视图状态的两个方法,即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;
}
希望这会有所帮助。快乐编码:)
推荐阅读
- oxid - OXID - 自定义控制器无法通过地址栏工作
- c# - MVC Core 构建参考
- javascript - matchMedia 在移动设备上隐藏 div
- dialogflow-es - 使用 Google.Apis.DialogFlow.V2 验证请求
- python - Python:检测 API 何时更新的最佳方法?
- ruby-on-rails - Ruby on Rails - Active Admin 未定义的方法“除了”#
- java - eclipse tycho + java 11 = 未知的 OSGi 执行环境:'JavaSE-11'
- repository - Datastage 存储库窗格
- xcode - 如何#include
在 Xcode 10 中 - javascript - JavaScript:将具有父键的对象数组转换为父/子树(包括没有父的对象)