【问题标题】:How to add items in listview using thread?如何使用线程在列表视图中添加项目?
【发布时间】:2016-04-23 16:04:19
【问题描述】:

我有一个简单的代码,但这不起作用如何解决这个问题线程正在运行但listview没有更新有什么问题谁能解释一下?

public Form1()
    {
        InitializeComponent();
        listView1.View = View.Details;
        listView1.FullRowSelect = true;
        listView1.Columns.Add("Problems", 80);
        listView1.Columns.Add("Data", 120);
        listView1.Columns.Add("Registry Key", 130);
        listView1.Columns.Add("users", 80);
        Thread childThread = new Thread(getlist);
        childThread.Start();
    }
    public void getlist()
    {
        int i;
        for (i = 0; i < 40; i++)
        {
            add("a", "b", "c", "d");
        }

    }
    public void add(string prob, string reg, string data, string user)
    {
        String[] row = { prob, reg, data, user };
        ListViewItem item = new ListViewItem(row);
        ListViewItem v = listView1.Items.Add(item);

        item.Checked = true;

    }

【问题讨论】:

  • 你忘了启动线程。 childThread.Start()
  • 另外你会遇到一个问题,它的解决方案是here
  • 如果您直接在 UI 线程上运行代码会发生什么(无论如何都应该如此)

标签: c# .net multithreading winforms


【解决方案1】:

问题很少。

  1. 您创建了一个线程但未调用启动。
  2. 即使你启动线程,它不会工作,因为你不能从其他线程更新控件,而不是创建控件的线程(通常称为UI线程),代码抛出@987654322 @错误。

解决这两个问题,您的代码应该如下所示

.

public Form1()
{
    InitializeComponent();
    listView1.View = View.Details;
    listView1.FullRowSelect = true;
    listView1.Columns.Add("Problems", 80);
    listView1.Columns.Add("Data", 120);
    listView1.Columns.Add("Registry Key", 130);
    listView1.Columns.Add("users", 80);
    Thread childThread = new Thread(getlist);
    childThread.Start();
}
public void getlist()
{
    add("a", "b", "c", "d");
}
public void add(string prob, string reg, string data, string user)
{
    String[] row = { prob, reg, data, user };

    ListViewItem item = new ListViewItem(row);


    if (listView1.InvokeRequired)
    {
         listView1.Invoke(new MethodInvoker(delegate
         {
             listView1.Items.Add(item);
             item.Checked = true;

         }));
    }   
    else
    {
        listView1.Items.Add(item);
        item.Checked = true;
    } 


}

【讨论】:

  • 实际上我正在阅读一些注册表,但是当我开始一个新线程时,值来自 vithin add();但是列表视图没有更新,发生这种情况我也使用了您的代码,但同样的问题并且使用了 thread.start();
  • 我猜,我知道发生了什么。可能控件的句柄尚不存在,InvokeRequired 向上搜索控件的父链,直到找到确实具有窗口句柄的控件或窗体。如果找不到合适的句柄,则 InvokeRequired 方法返回 false。检查InvokeRequired 是否返回false
  • 已经编辑了我正在做的代码我正在使用 for 循环,请查看并帮助我
  • 这不是问题,请在启动线程后尝试放置Application.DoEvents()
猜你喜欢
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多