我有一个带有ASP表的.aspx网站。在代码隐藏文件中,我在表格中填入行,单元格,单元格中是ASP TextBoxes。
在第一次加载时,我使用数据库中的值填充TextBoxes。但是在有人编辑了值并使用创建的按钮提交页面之后,就无法访问该程序创建的表格行。
现在我看到一些帖子表明动态创建的asp表正在被回发重置。
现在我有一个问题,如何获取网站上用户更改的值?!
我试图覆盖SaveViewState和LoadViewState,但只在页面加载后才调用SaveViewState,但是如果有人点击按钮则不会调用?
我想保存文本框的数据,我可以在用户点击按钮后在代码中使用它们。
我该怎么办?
答案 0 :(得分:1)
a)必须在Page Init事件中创建动态创建的控件。这样,它们在ViewState恢复时存在(在Page Load之前发生)。
b)你必须始终在Page Init中创建它们,无论它是否是PostBack。
c)始终以相同的顺序创建控件。
然后,他们会在PostBack期间自动保留其值。
答案 1 :(得分:1)
这里有3个按键,由@Alexander完美表达。
这是一个代码示例:
<%@ Page Title="Home Page" Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<form runat="server">
<asp:PlaceHolder ID="placeHolder1" runat="server" />
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Submit"/>
</form>
代码背后:
using System;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : Page
{
private static readonly List<String> _listOfThings = new List<String> { "John", "Mary", "Joe" };
private List<TextBox> _myDynamicTextBoxes;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
_myDynamicTextBoxes = new List<TextBox>();
var i = 0;
foreach (var item in _listOfThings)
{
var tbox = new TextBox {ID = "TextBox" + (i++),Text=item};
placeHolder1.Controls.Add(tbox); //make sure you are adding to the appropriate container (which must live in a Form with runat="server")
_myDynamicTextBoxes.Add(tbox);
}
}
protected void Button1_Click(Object sender, EventArgs e)
{
foreach (var tbox in _myDynamicTextBoxes)
{
Response.Write(String.Format("You entered '{0}' in {1}<br/>", tbox.Text, tbox.ID));
}
}
}