【问题标题】:ASP.NET dynamic ASP Table with TextBoxes - Save Values in ViewState带有文本框的 ASP.NET 动态 ASP 表 - 在 ViewState 中保存值
【发布时间】:2013-06-07 13:35:04
【问题描述】:

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

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

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

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

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

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

我能做什么?

【问题讨论】:

    标签: c# asp.net iis postback viewstate


    【解决方案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));
            }
        }
    }
    

    【讨论】:

    • 我尝试使用 OnInit 事件在恢复数据之前创建动态添加的控件,并且效果很好。非常感谢您的帮助!
    【解决方案2】:

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

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

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

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

    请阅读:ASP.NET Page Life Cycle Overview

    【讨论】:

      猜你喜欢
      • 2010-12-07
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多