У меня есть страница с несколькими элементами управления типа 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();
}
}
Мне что-то не хватает? Как сохранить значения при нажатии кнопки?
Причина, по которой вы теряете информацию о MyControl (s..), - это когда вы нажимаете кнопку, которую вы очищаете:
pnlControls.Controls.Clear();
Если вы хотите сохранить значения, которые я рекомендую вам использовать переменные сеанса, например массив, когда вы запускаете "txtField_TextChanged" для сохранения "lblAnswer.Text", будьте осторожны с идентификатором, чтобы отличать друг от друга в переменной Session.
Наконец, я бы поставил "LoadControls()"; внутри Page_Load, за пределами Я думаю, что это избыточно.
LoadControls()
в методе события click,LoadControls()
в том, что нажатие кнопки добавляет еще один элемент управления на страницу. Без этого элемент управления не добавляется до следующей обратной передачи.