我有一个页面,其中包含许多动态添加的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();
}
}
我错过了一些明显的东西吗?如何在单击按钮时保留值?
答案 0 :(得分:3)
您丢失MyControl(s ..)信息的原因是当您单击清除它们的按钮时:
pnlControls.Controls.Clear();
如果你想保留值,我建议你使用Session变量,例如当你触发“txtField_TextChanged”以保存“lblAnswer.Text”时的数组,请注意ID以在Session变量中相互区分
最后,我把“LoadControls();”在Page_Load里面,我认为这是多余的。