1

我正在使用 c# 在 Asp.Net 中制作一个 Web 应用程序,让您可以将项目添加到列表中。

我的问题是,每次我单击按钮将新项目添加到列表中时,它只会显示最后一个项目,而列表计数器只显示 1 。

我究竟做错了什么??

这是代码:

public partial class home : System.Web.UI.Page
{
 List<string> messageboxs = new List<string>();
 public string val = "";
 public string data = "";

 protected void Button1_Click(object sender, EventArgs e)
 {
    val = "";
    messageboxs.Add(text1.Text);
    ListBox1.DataSource = messageboxs;
    ListBox1.DataBind();
    val = messageboxs.Count.ToString();
 }
}
4

5 回答 5

4

您的列表不会在回发之间保留。

每次单击按钮时,都会创建页面类的新实例,因此会创建列表。此列表为空。

于 2012-12-13T10:33:02.277 回答
3

您应该阅读ASP.NET 页面生命周期概述。简而言之,每次单击按钮都会导致页面回发,从而创建页面的新实例。您正在该页面的每个实例上初始化一个空列表,因此当您将新项目添加到列表中时......它再次为空。

您需要做的是将其存储在messageboxs某个允许它在回发中持续存在的地方。对于您的特定示例,您可以使用ViewState例如

public partial class home : System.Web.UI.Page
{
    private void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            // initialise list
            ViewState["Messages"] = new List<string>();
        }
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        // get the old messages list
        var messages = (List<string>)ViewState["Messages"];
        messages.Add(text1.Text);
        ListBox1.DataSource = messages;
        ListBox1.DataBind();
        // store the new messages list
        ViewState["Messages"] = messages;
    }   
}
于 2012-12-13T10:36:50.963 回答
1

问题在于 ASP.Net 的工作方式。ASP.Net 在每个按钮单击时重新创建您的“主页”页面。然后,这将重新创建列表,并向其中添加一项。您需要一种在按钮单击之间保存列表的方法。例如,这就是Session的用途。

于 2012-12-13T10:33:46.407 回答
0

使您的消息框静态变量为

静态列表消息框 = new List();

但这使得该变量可以从任何页面请求中访问。这意味着如果其他人打开此页面并尝试添加一个项目,他/她最终会将一个项目添加到其他人的列表中。

尝试使用会话状态或视图状态。

于 2012-12-13T10:46:56.600 回答
0

该列表在每次回发时再次创建。您应该查看现有项目ListBox1并将它们重新添加到您的List<string>然后重新绑定中。

于 2012-12-13T10:34:06.023 回答