Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我用计时器更新Listview时,它会闪烁_C# - Fatal编程技术网

C# 当我用计时器更新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); } } 我希望只有被更改

我想用计时器(1秒刷新)更新部分或全部listview的项和子项内容,但listview每1秒都会闪烁一次。有时在重画期间子项会丢失。因为我的listview包含随时可能更改的数据,所以我使用计时器

代码: 我把这个函数放在计时器的滴答法中

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,我学到了一些新东西!!我刚刚推荐了您的解决方案,因为它简单实用,做得很好!:)