【问题标题】:Values in dynamically added controls not retained on postback回发时未保留的动态添加控件中的值
【发布时间】:2015-03-31 15:17:34
【问题描述】:

我有一个页面,其中包含许多动态添加的MyControl 类型的控件。计数存储在ViewState 中,仅在单击按钮时递增。

MyControl 中,我有一个TextBox 控件和一个Label 控件。当文本框中的文本发生变化时,该值乘以 2 并显示在标签控件中。

为此,我添加了一个OnTextChanged 事件并将AutoPostBack 设置为true。

我的问题是这样的:当我在页面上有任意数量的MyControl 并更改任何文本框中的文本时,标签会更新并且值会在回发时保留。

但是,如果我单击页面上的增量按钮,文本框和标签中的所有值都会丢失。

我的代码:

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Test.Default" EnableViewState="true" %>

<html>
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        Count:
        <asp:Label ID="lblCount" runat="server"></asp:Label>
        <asp:Button ID="btnAdd" runat="server" OnClick="btnAdd_Click" Text="+" />
        <asp:Panel ID="pnlControls" runat="server"></asp:Panel>

    </form>
</body>
</html>

Default.aspx.cs

public partial class Default : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {

        int count = 0;

        //if not postback, then set count and store in viewstate
        if (!Page.IsPostBack)
        {
            count = 1;
            ViewState["count"] = count;
        }

        LoadControls();
    }

    protected void btnAdd_Click(object sender, EventArgs e)
    {
        //increment count 
        ViewState["count"] = (int)ViewState["count"] + 1;
        pnlControls.Controls.Clear();

        LoadControls();
    }

    private void LoadControls()
    {
        //add controls to page
        for (int i = 0; i < (int)ViewState["count"]; i++)
        {
            MyControl con = (MyControl)LoadControl("MyControl.ascx");
            con.ID = i.ToString();

            pnlControls.Controls.Add(con);
        }

        //set count label
        lblCount.Text = ViewState["count"].ToString();
    }

}

MyControl.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyControl.ascx.cs" Inherits="Test.MyControl" EnableViewState="true" %>

<div>
    <asp:TextBox ID="txtField" runat="server" OnTextChanged="txtField_TextChanged" AutoPostBack="true"></asp:TextBox>
    <asp:Label ID="lblAnswer" runat="server" Text="answer:"></asp:Label>
</div>

MyControl.ascx.cs

public partial class MyControl : System.Web.UI.UserControl
{

    public string Text;
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void txtField_TextChanged(object sender, EventArgs e)
    {
        lblAnswer.Text = (int.Parse(txtField.Text) * 2).ToString();
    }
}

我是否遗漏了一些明显的东西?单击按钮时如何保留值?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    您丢失 MyControl(s..) 信息的原因是当您单击清除它们的按钮时:

     pnlControls.Controls.Clear();
    

    如果您想保留我建议您使用会话变量的值,例如当您触发“txtField_TextChanged”以保存“lblAnswer.Text”时的数组,请注意 ID 以在会话变量中相互区分.

    最后,我会输入“LoadControls();”在Page_Load里面,在外面我觉得是多余的。

    【讨论】:

    • 感谢您的回复。我清除控件并在单击事件方法中使用LoadControls() 的原因是按钮单击会向页面添加另一个控件。没有这个,控件直到下一次回发才会添加。
    • 是的,没关系,但这是您丢失控件内的值的原因,请使用 Session 变量来避免这种情况。
    猜你喜欢
    • 2014-02-15
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多