我想用计时器更新部分或全部listview的项目和子项目内容(1秒刷新)但列表视图每秒闪烁一次。有时在重绘期间子项丢失。因为我的listview包含可能随时更改的数据,所以我使用了计时器。
代码: 我把这个函数放在计时器的Tick方法
中void Refresh()
{
foreach(string s in lsttring)
{
lv.items.add(s);
lv.items[i].subitems.add(i);
}
}
我希望只更改项目内容(项目文本和子项目文本),而不是整个列表视图以及计时器滴答。
答案 0 :(得分:4)
ListView控件支持双缓冲,它将DoubleBuffered属性映射到本机控件的LVS_EX_DOUBLEBUFFER样式标志。它非常有效但你不能直接使用它,因为它是受保护的属性。在项目中添加一个新类并粘贴下面显示的代码。编译。将新控件从工具箱顶部拖放到表单上,替换旧表单。
using System;
using System.Windows.Forms;
class BufferedListView : ListView {
public BufferedListView() {
this.DoubleBuffered = true;
}
}
答案 1 :(得分:1)
试试这个:
void Refresh()
{
lv.BeginUpdate();
foreach(string s in lsttring)
{
lv.items.add(s);
lv.items[i].subitems.add(i);
}
lv.EndUpdate();
}
以这种方式更新所有项目,listview仅在此操作结束时刷新 来自Microsoft:
...如果你想使用Add的方法一次添加一个项目 ListView.ListViewItemCollection类,可以使用
BeginUpdate
防止控件每次都重新绘制ListView的方法 添加了一个项目。完成添加任务后 要控制的项目,请调用EndUpdate
方法以启用ListView 重画。 这种添加项目的方式可以防止闪烁绘图 当大量项目被添加到控件时ListView。