动态添加的控件中的值未保留在回发上

时间:2015-03-31 15:17:34

标签: c# asp.net

我有一个页面,其中包含许多动态添加的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();
    }
}

我错过了一些明显的东西吗?如何在单击按钮时保留值?

1 个答案:

答案 0 :(得分:3)

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

 pnlControls.Controls.Clear();

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

最后,我把“LoadControls();”在Page_Load里面,我认为这是多余的。