2

我有一个带有 ASP 表的 .aspx 站点。在文件后面的代码中,我用行、单元格填充表格,单元格中是 ASP 文本框。

在第一次加载时,我用数据库中的值填充文本框。但是在有人编辑值并使用创建的按钮提交页面后,无法访问以编程方式创建的表行。

现在我看到一些帖子说动态创建的 asp 表正在被回发重置。

现在我有一个问题,如何获取网站上用户更改的值?!

我试图覆盖 SaveViewState 和 LoadViewState,但 SaveViewState 仅在页面加载后调用,而不是在有人单击按钮时调用?

我想保存文本框的数据,我可以在用户单击按钮后在代码中使用它们。

我能做些什么?

4

2 回答 2

1

a) 必须在 Page Init 事件中创建动态创建的控件。这样,它们会在 ViewState 恢复时存在(发生在页面加载之前)。

b)您必须始终在 Page Init 中创建它们,无论它是否是 PostBack。

c) 始终以相同的顺序创建控件。

然后,它们会在 PostBack 期间自动保留它们的值。

请阅读:ASP.NET 页面生命周期概述

于 2013-06-07T13:55:17.187 回答
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));
        }
    }
}
于 2013-06-07T14:07:11.020 回答