当我用计时器更新Listview时,它会闪烁

本文关键字:闪烁 Listview 计时器 更新 | 更新日期: 2023-09-27 18:16:42

我想更新一些或所有我的listview的项目和子项内容与定时器(1秒刷新),但listview闪烁每一秒。有时在重绘时子项会丢失。因为我的listview包含随时可能被更改的数据,所以我使用了计时器。

代码:我把这个函数放在计时器的Tick方法

void Refresh()
{
   foreach(string s in lsttring)
   {
      lv.items.add(s);
      lv.items[i].subitems.add(i);
   }
}

我希望只有项目内容(项目文本和子项文本)被改变,而不是整个listview随着计时器滴答。

当我用计时器更新Listview时,它会闪烁

ListView控件支持双缓冲,它将DoubleBuffered属性映射到本机控件的LVS_EX_DOUBLEBUFFER样式标志。这是非常有效的,但你不能直接得到它,因为它是受保护的财产。向项目添加一个新类,并粘贴如下所示的代码。编译。将新控件从工具箱顶部拖放到窗体上,替换旧控件。

using System;
using System.Windows.Forms;
class BufferedListView : ListView {
    public BufferedListView() {
        this.DoubleBuffered = true;
    }
}

试试这个:

void Refresh()
{
   lv.BeginUpdate();
   foreach(string s in lsttring)
   {
      lv.items.add(s);
      lv.items[i].subitems.add(i);
   }
   lv.EndUpdate();
}

通过这种方式,您可以更新所有项,并且listview将仅在此操作结束时刷新。
从微软:

…的add方法一次添加一个项列表视图。ListViewItemCollection类,你可以使用BeginUpdate方法,以防止控件每次都重新绘制ListView添加了一个项目。当您完成添加任务时项到控件,调用EndUpdate方法来启用ListView重画。这种添加项目的方式可以防止闪烁的绘制

当控件中添加了大量项时,将显示在ListView中。