C# 当我用计时器更新Listview时,它会闪烁
我想用计时器(1秒刷新)更新部分或全部listview的项和子项内容,但listview每1秒都会闪烁一次。有时在重画期间子项会丢失。因为我的listview包含随时可能更改的数据,所以我使用计时器 代码: 我把这个函数放在计时器的滴答法中C# 当我用计时器更新Listview时,它会闪烁,c#,C#,我想用计时器(1秒刷新)更新部分或全部listview的项和子项内容,但listview每1秒都会闪烁一次。有时在重画期间子项会丢失。因为我的listview包含随时可能更改的数据,所以我使用计时器 代码: 我把这个函数放在计时器的滴答法中 void Refresh() { foreach(string s in lsttring) { lv.items.add(s); lv.items[i].subitems.add(i); } } 我希望只有被更改
void Refresh()
{
foreach(string s in lsttring)
{
lv.items.add(s);
lv.items[i].subitems.add(i);
}
}
我希望只有被更改的项目内容(项目文本和子项目文本)才会随着计时器的滴答声在整个列表视图中更改。尝试以下操作:
void Refresh()
{
lv.BeginUpdate();
foreach(string s in lsttring)
{
lv.items.add(s);
lv.items[i].subitems.add(i);
}
lv.EndUpdate();
}
通过这种方式,您将更新所有项目,并且listview将仅在该操作结束时刷新。发件人: …如果要使用的添加方法一次添加一个项目 ListView.ListViewItemCollection类,您可以使用
BeginUpdate
方法来防止控件每次重新绘制ListView
添加一个项目。完成添加任务后
项,调用EndUpdate
方法以启用ListView
重新粉刷这种添加项目的方式可以防止图形闪烁
将许多项添加到控件时的列表视图
ListView控件支持双缓冲,它将DoubleBuffered属性映射到本机控件的LVS_EX_DOUBLEBUFFER样式标志。它非常有效,但您无法直接访问它,因为它是受保护的财产。向项目中添加一个新类并粘贴如下所示的代码。编译。将工具箱顶部的新控件放到窗体上,替换旧控件
using System;
using System.Windows.Forms;
class BufferedListView : ListView {
public BufferedListView() {
this.DoubleBuffered = true;
}
}
关于如何从其他线程更新列表视图,有很多问题都有很好的答案,请尝试搜索。如果没有帮助,在EndUpdate调用时它仍然会闪烁。@HansPassant:这是因为刷新率太高吗?它只会随着频繁的更新而变得明显,1秒是非常明显的。Listview是一个有点闪烁的bug,因为它倾向于在Details视图中填充大量文本。这就是为什么它有LVS_EX_DOUBLEBUFFER风格的标志。谢谢你的评论@HansPassant,我学到了一些新东西!!我刚刚推荐了您的解决方案,因为它简单实用,做得很好!:)