Значения в динамически добавленных элементах управления не сохраняются при обратной передаче

1

У меня есть страница с несколькими элементами управления типа 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 ответ

3
Лучший ответ

Причина, по которой вы теряете информацию о MyControl (s..), - это когда вы нажимаете кнопку, которую вы очищаете:

 pnlControls.Controls.Clear();

Если вы хотите сохранить значения, которые я рекомендую вам использовать переменные сеанса, например массив, когда вы запускаете "txtField_TextChanged" для сохранения "lblAnswer.Text", будьте осторожны с идентификатором, чтобы отличать друг от друга в переменной Session.

Наконец, я бы поставил "LoadControls()"; внутри Page_Load, за пределами Я думаю, что это избыточно.

  • 0
    Спасибо за ваш ответ. Причина, по которой я очищаю элементы управления и использую LoadControls() в методе события click, LoadControls() в том, что нажатие кнопки добавляет еще один элемент управления на страницу. Без этого элемент управления не добавляется до следующей обратной передачи.
  • 0
    Да, и это нормально, но это причина того, что вы теряете значения внутри элементов управления, используйте переменную Session, чтобы избежать этого.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню