【问题标题】:Listview flickers when I update it with a timer当我用计时器更新它时,Listview 会闪烁
【发布时间】:2011-12-04 21:17:52
【问题描述】:

我想用计时器(1 秒刷新)更新我的部分或全部列表视图的项目和子项目内容,但列表视图每秒钟闪烁一次。有时在重绘过程​​中子项会丢失。因为我的列表视图包含随时可能更改的数据,所以我使用了计时器。

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

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

我希望只有更改的项目内容(项目文本和子项目文本)会被更改,而不是整个列表视图以及计时器滴答声。

【问题讨论】:

  • 有很多关于如何从其他线程更新列表视图的问题有很好的答案,请尝试搜索

标签: c#


【解决方案1】:

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

using System;
using System.Windows.Forms;

class BufferedListView : ListView {
    public BufferedListView() {
        this.DoubleBuffered = true;
    }
}

【讨论】:

    【解决方案2】:

    试试这个:

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

    通过这种方式,您可以更新所有项目,并且列表视图将仅在此操作结束时刷新。
    来自Microsoft

    ...如果您想使用 Add 方法一次添加一个项目 ListView.ListViewItemCollection 类,可以使用BeginUpdate 防止控件每次重绘ListView的方法 添加了一个项目。完成添加任务后 项目到控件,调用EndUpdate方法启用ListView 重新粉刷。 这种添加项目的方式可以防止闪烁的绘制 向控件添加大量项目时的 ListView。

    【讨论】:

    • 没有帮助,它仍然在 EndUpdate 调用时闪烁。
    • @HansPassant:是不是因为刷新率太高了?
    • 频繁更新会变得很明显,1秒很明显。 Listview 有点闪烁错误,因为它倾向于在详细信息视图中塞入大量文本。这就是它具有 LVS_EX_DOUBLEBUFFER 样式标志的原因。
    • 感谢您的评论@HansPassant,我学到了一些新东西!我刚刚赞成您的解决方案,因为它简单实用,干得好! :)
    猜你喜欢
    • 2015-03-18
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多