解决C# listview多线程调用闪烁问题与注意事项
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();