繁体   English   中英

ListView不会更新

[英]ListView wont update

我们用MainWindow制作了一个名为MV的应用程序。

当main启动时,它将启动我们的StartProgram方法作为BackgroundWorker和Application.Run(MW);。

MainWindow MW = new MainWindow();
BackgroundWorker.DoWork += (obj, e) => StartProgram(MW);
BackgroundWorker.RunWorkerAsync();
Application.Run(MW);

在StartProgram中,我们创建Patient的实例,并将其显示在listView1中。 我们通过调用此方法来实现此目的,该方法在MW中:

public void SetListSource(Patient p)
{
    ListViewItem item = new ListViewItem("woohoo");
    item.SubItems.Add("a");
    listView1.Items.Add(item);
}

StartProgram到达listView1.Items.Add(item);时停止。

我们的猜测是,它等待MW(MainWindow),但我们不知道如何解决它。 我们在MW中有一个按钮,它的功能与此类似,只不过它仅将“ 1”和“ a”发送到listView1。

private void Sort_Button_Click(object sender, EventArgs e)
{
    ListViewItem item = new ListViewItem("1");
    item.SubItems.Add("a");
    listView1.Items.Add(item);
}

有人知道如何使SetListSource(...)用作Sort_Button_Click(...)吗?

编辑通过调用解决

不能直接从另一个线程修改GUI 您需要使用委托并调用您的控件。 在您的线程中,您必须执行以下操作:

CONTROL.Invoke(new Action(() =>
{
  CONTROL.Items.Add(item);
}
));

资源:

BackgroundWorker对表单的多线程访问

可以使用Invoke ,但这可能是不必要的。 您可以改用BackgroundWorker.RunWorkerCompleted事件:

BackgroundWorker.DoWork += 
  (s, e) => 
  {
    e.Result = DoAllTheComplicatedWork();
  }
BackgroundWorker.RunWorkerCompleted +=
  (s, e) =>
  {
    // Back on the UI thread, we can do whatever we want
    listView1.Items.Add(((SomeDTO)e.Result).Patient);
  }
BackgroundWorker.RunWorkerAsync();

或者,您可以使用await完成整个操作:

MW.Load += async (s, e)
  {
    var result = await Task.Run(() => SomeCPUWork());
    listView1.Items.Add(((SomeDTO)e.Result).Patient);
  }

关键是,您确实希望将UI与后台需要执行的操作分开。 我绝对不会将表单(或任何其他控件)传递给应该在不同线程上执行的任何方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM