【问题标题】:Event handler doesn't change text in Label事件处理程序不会更改标签中的文本
【发布时间】:2018-11-28 21:18:45
【问题描述】:

问题:事件处理程序quantity_TextChanged 不会更改会话变量“list”以反映当前状态。事件处理程序附加到addItemRowToTable 生成的所有文本框,并通过分配的 id 区分它们。

我确定缺少某些东西,但我不确定。

附加信息:我需要这样一种方式,即对多个文本框所做的更改都保存到 1 个会话变量中,以便以后在会话中进一步使用,按照它们在表中显示的顺序。然后,每个文本框的值将用于其旁边的标签中(每个文本框 1 个标签)。

想要的结果:

Header                      Header2 
[TextBox with value of 42]  [Label displaying 42]
[TextBox with value of 76]  [Label displaying 76]
[TextBox with value of 105] [Label displaying 105]

WebForm1.aspx.cs

protected void Page_LoadComplete(object sender, EventArgs e)
{
    if (Session["list"] != null)
    {
        List<int> numbers = Session["list"] as List<int>;
        int index = 0;
        foreach (int item in numbers)
        {
            tblItems.Rows.AddAt(index + 1, addItemRowToTable(item, index));
            // For debugging purposes
            Response.Write("<script>console.log(\"" + item.ToString() + "\");</script>");
            index++;
        }
    }

}

private TableRow addItemRowToTable(int item, int index)
{
    TableCell[] cells = { new TableCell(), new TableCell() };
    TableRow row = new TableRow();

    TextBox box = new TextBox();
    box.ID = String.Format("{0}_q", index);
    box.Attributes["type"] = "number";
    box.Attributes["min"] = "1";
    box.Attributes["width"] = "60px";
    box.TextChanged += new EventHandler(quantity_TextChanged);
    box.AutoPostBack = true;
    cells[0].Controls.Add(box);

    Label lbl = new Label();
    lbl.ID = String.Format("{0}_l", index);
    lbl.Text = item.ToString();
    cells[1].Controls.Add(lbl);

    foreach (TableCell cell in cells)
        row.Cells.Add(cell);
    return row;
}

protected void Button1_Click(object sender, EventArgs e)
{
    if (Session["list"] != null)
    {
        List<int> numbers = Session["list"] as List<int>;
        numbers.Add(0);
        Session["list"] = numbers;
    }
    else
    {
        List<int> numbers = new List<int>();
        numbers.Add(0);
        Session["list"] = numbers;
    }
}

private void quantity_TextChanged(object sender, EventArgs e)
{
    if (Session["list"] != null)
    {
        TextBox item = sender as TextBox;
        int position = Convert.ToInt32(item.ID.Split('_')[0]);

        List<int> numbers = Session["list"] as List<int>;
        numbers[position] = Convert.ToInt32(item.Text);
        Session["list"] = numbers;
    }
}

WebForm1.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Assignment2.WebForm1" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
        <br />
        <br />
        <asp:Table ID="tblItems" runat="server">
            <asp:TableHeaderRow>
                <asp:TableHeaderCell>Header</asp:TableHeaderCell>
                <asp:TableHeaderCell>Header2</asp:TableHeaderCell>
            </asp:TableHeaderRow>
        </asp:Table>
        </div>
    </form>
</body>
</html>

【问题讨论】:

  • 您的期望是,您应该在输入文本框后立即看到标签文本发生变化?
  • @ChetanRanpariya 是的;当对文本框进行更改时,必须触发 AutoPostback,并且它旁边的标签必须更新为更改后的值。

标签: c# asp.net event-handling


【解决方案1】:

首先,您不需要在Page_LoadComplete 中。我认为这可能是您尝试在单击按钮后添加正确数量的文本框。但是按钮单击应该只是添加一个新的文本框,仅此而已。在 Page_Load 中,您需要添加存储在 Session 中的 TextBoxes。 请参阅下面的示例,了解具有 TextChanged 事件的有效解决方案,因为所有正确的控件都在回发时重新创建。

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack == false)
    {
        //do not add or manipulate dynamic controls inside an ispostback check
    }

    //check if the session exists
    if (Session["list"] != null)
    {
        //add the correct number of textboxes from session
        for (int i = 1; i <= Convert.ToInt32(Session["list"]); i++)
        {
            addTextBox(i);
        }
    }
}


private void addTextBox(int index)
{
    //create a new textbox
    TextBox tb = new TextBox();
    tb.ID = "DynamicTextBox" + index;
    tb.AutoPostBack = true;

    //add an event to the textbox
    tb.TextChanged += new EventHandler(quantity_TextChanged);

    //add the textbox to the page
    PlaceHolder1.Controls.Add(tb);
}


protected void Button1_Click(object sender, EventArgs e)
{
    int index = 1;

    //get the current textbox count if it exists
    if (Session["list"] != null)
    {
        index = Convert.ToInt32(Session["list"]) + 1;
    }

    //add a new textbox
    addTextBox(index);

    //upate the session with the new value
    Session["list"] = index;
}


private void quantity_TextChanged(object sender, EventArgs e)
{
    //display the textbox value in a label for testing
    Label1.Text = ((TextBox)sender).Text;
}

【讨论】:

  • 感谢您的回答,但我想保留添加到表中的文本框的值,然后将值呈现到标签上。我还希望文本框和标签出现在表格内。为此,我需要将对文本框所做的更改存储到 1 个会话变量中。
  • 那些东西彼此没有关系。为了保存正确的文本框值或显示正确的标签,您首先需要具有用于动态添加文本框的工作代码。如果没有,那么您甚至无法获取这些值,因为如果不重新创建文本框,它们将会丢失。
  • 文本框已经可以正确添加;只是他们无法将自己的值存储到 Session 变量中。
  • 不,他们不是。如果您没有正确添加它们,您将无法在 PostBack 之后获取值,但现在您可以使用 FindControl,因为您知道 ID 序列并获取值。
  • 好的...在对实际表单(不是上面的那个)执行主要重构之后,我承认您的解决方案有效。谢谢你的帮助。 :)
猜你喜欢
  • 2017-09-21
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多