.NET ListView 闪烁问题的完美解决方法
Posted by Admin L in .NET Programming on 06-04-2012. Tags: .NET 编程经验
作者:牧山道人
原文地址:https://www.seeksunslowly.com/dot-net-listview-flicker-resolve-sc
转载请注明出处,谢谢。
_____________________________________
在对 ListView 数据(Items)作高频率的添加、删除、修改操作时,ListView 会出现闪烁。
这使软件显得很不专业,自己看着也眼花,所以,这是必须解决的难题。
尝试了 ListView 类的 BeginUpdate、EndUpdate、SuspendLayout、ResumeLayout、Refresh 等方法,以及他们的组合使用,均未完美解决。
若干年前使用过 Delphi,隐约记起 TListView 有个双缓冲的属性,于是,尝试继承了一个 ListView 类,在构造函数中加入双缓冲的设置并作测试。
结果比想象中还要顺利,因为一次就成功了。
以下是继承 .NET 中 ListView 类实现的新类 TListView 代码(VB 2008):
[cc lang=”vbnet”]
Imports System.Windows.Forms
Public Class TListView
Inherits ListView
Public Sub New()
‘ 使用双缓冲,避免频繁操作 TListView 条目时产生闪烁。
SetStyle(ControlStyles.DoubleBuffer Or _
ControlStyles.OptimizedDoubleBuffer Or _
ControlStyles.AllPaintingInWmPaint, True)
UpdateStyles()
End Sub
End Class
[/cc]
如果你使用 C#,本道亦提供 C# 代码供参考:
[cc lang=”csharp”]
class TListView : ListView
{
public DoubleBufferListView()
{
SetStyle(ControlStyles.DoubleBuffer |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint, true);
UpdateStyles();
}
}
[/cc]
注意:
1、要应用 TListView 类到现有代码,只须替换代码中的 System.Windows.Forms.ListView(一般由 .NET 自动生成) 为 TListView 即可(当然,你可能也使用了命名空间)。
2、该代码在 Details 模式的 TListView 中测试成功(一般也只会在 Details ListView 中展示大量数据)。
3、本道估计这个思路也可应用于 TreeView(没测试),如果有需求,可以自己试试。
果然有用,谢谢分享
朋友,不客气