使用计时器更新listview的项目和子项目

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

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

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

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

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将仅在此操作结束时刷新。
来自微软 :

…如果要使用ListView.ListViewItemCollection类的Add方法一次添加一个项目,则可以使用BeginUpdate方法阻止控件在每次添加项目时重新绘制ListView。 完成向控件添加项目的任务后,调用EndUpdate方法以启用ListView重绘。 这种添加项目的方法可以防止在将大量项目添加到控件时对ListView进行闪烁绘制