程序开发 > C# > Winform > 正文

解决C# listview多线程调用闪烁问题与注意事项

亮术网 2020-08-13 本网原创

listview单线程(通常是创建listview控件的线程)调用绑定数据时不会发生闪烁问题,而listview多线程调用又是另外一遍天地,从开始向 listview 添加数据到绑定结束,listview 一直闪烁不断,翻两页眼睛都受不了了。

这个问题应该怎么解决?C#已经提供了一种简单的解决方案,只要开始向 listview 添加数据前加一句 listview.BeginUpdate(),结束添加数据后再加一句 listview.EndUpdate(),C# listview闪烁就完美解决了。其实 listview闪烁是每添加一次数据因 listview 的布局有变化都刷新屏幕所致,BeginUpdate() 和 EndUpdate() 就是告诉 listview 添加数据开始后不要刷新屏幕,直到添加数据结束刷新一次即可。

 

一、解决 C# listview闪烁问题实例

以下是一个listview多线程调用防闪动完整实例,代码如下:

using System.Threading;

/// <summary>
  /// 线程开始执行
  /// </summary>

  private void StartThread()
  {
    Thread thread = new Thread(new ThreadStart(ThreadListView));
    thread.Start();
  }

/// <summary>
  /// 解决listview多线程调用闪烁问题实例
  /// </summary>

  private void ThreadListView()
  {
    listView1.BeginUpdate();//防listview闪烁开始
    AddListView();
    listView1.EndUpdate();//防listview闪烁结束
  }

/// <summary>
  /// 向 listview 添加数据,多线程调用控件
  /// </summary>

  private void AddListView()
  {
    listView1.Clear();
    listView1.GridLines = true;
    listView1.View = View.Details;
    listView1.Scrollable = true;
    listView1.MultiSelect = false;

  listView1.Columns.Add("产品名称", 180, HorizontalAlignment.Center);
    listView1.Columns.Add("产品价格", 100, HorizontalAlignment.Center);

  ListViewItem lvi = new ListViewItem();
    lvi.SubItems.Clear();
    lvi.SubItems[0].Text = "笔记本电脑";
    lvi.SubItems.Add("5000");
    listView1.Items.Add(lvi);

  lvi = new ListViewItem();
    lvi.SubItems[0].Text = "名牌手机";
    lvi.SubItems.Add("2800");
    listView1.Items.Add(lvi);
  }

调用方法:StartThread();

 

 

二、C# listview多线程调用防闪烁【注意事项】

如果在开始向 listview 添加数据前加了 listView1.BeginUpdate();,程序途中返回,一定要加 listView1.EndUpdate();,否则listView 一直处于绑定数据未结束状态而影响程序正常运行。如:

listView1.BeginUpdate();
  if(条件为真)return;//错误

if(条件为真)//正确
  {
    listView1.EndUpdate();
    return;
  }

ListViewItem lvi = new ListViewItem();
  lvi.SubItems.Clear();
  lvi.SubItems[0].Text = "笔记本电脑";
  lvi.SubItems.Add("5000");
  listView1.Items.Add(lvi);

listView1.EndUpdate();