带有TextBoxes的ASP.NET动态ASP表 - 在ViewState中保存值

时间:2013-06-07 13:35:05

标签: c# asp.net iis postback viewstate

我有一个带有ASP表的.aspx网站。在代码隐藏文件中,我在表格中填入行,单元格,单元格中是ASP TextBoxes。

在第一次加载时,我使用数据库中的值填充TextBoxes。但是在有人编辑了值并使用创建的按钮提交页面之后,就无法访​​问该程序创建的表格行。

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

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

我试图覆盖SaveViewState和LoadViewState,但只在页面加载后才调用SaveViewState,但是如果有人点击按钮则不会调用?

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

我该怎么办?

2 个答案:

答案 0 :(得分:1)

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

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

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

然后,他们会在PostBack期间自动保留其值。

请阅读:ASP.NET Page Life Cycle Overview

答案 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));
        }
    }
}