使用C#,如何更新另一个类的列表框项?

时间:2010-12-02 14:59:19

标签: c# asp.net multithreading listbox

HY,

在我的项目asp.net(c#)中,我使用线程来处理一些消息。我有一个显示页面,其中包含一个列表框,其中包含处理消息时所采取的所有操作。还有一个我正在处理消息的课程。

Default.aspx的:

        protected void Page_Load(object sender, EventArgs e)
        {
            //starts the thread and call the method from Process.cs
        }

        public void SetListItem(string text)
        {
            myListBox.Items.Add(text);
            myListBox.DataBind();
        }

Process.cs

public class Process
{
  public Process()
  {
    Default defaultPage;
    defaultPage.SetListItem("==> Received message!");
  }
}

但是列表框没有显示任何内容。 有没有人有我错的地方? 感谢。

杰夫

3 个答案:

答案 0 :(得分:2)

删除数据绑定

 myListBox.DataBind();

您不需要它,因为您要将项目添加到列表集合中。如果您正在设置DataSource属性,则必须使用它。这完全取决于您的更新正在触发的生命周期中的位置。可能是您的更新也被代码中的其他位置的代码替换。

事实上,我认为这是一个单独的线程。由于您需要在页面向浏览器提交信息之前更新它,您需要将其保存在同一个线程中以确保它完成,或者您需要在结束时进行某种检查。您的页面执行过程以确保它已完成。页面处理完毕后,您的线程可能正在完成。

答案 1 :(得分:0)

asp.net页面(例如Default)生成html,返回给请求的浏览器。生成此html并将其发送到浏览器后,您无法将服务器端的项目添加到浏览器中显示的内容。

所以产生一些功能的产生线程对你当前的场景来说并不是一个好主意。

答案 2 :(得分:0)

克劳斯是对的。一旦页面被绘制,它就坐在那里。

所以,要做你想做的事,在一个单独的线程中运行Process: 将输出消息在Process中写入数据存储,即使它只是附加到文本文件。然后,将页面设置为每X次自动刷新一次,并在加载时使用该数据存储的内容重新填充列表框。

稍后,当一切正常时,您可以使用Ajax只进行列表框刷新,而不是整个页面。