.NET ListView 闪烁问题的完美解决方法

Posted by Admin L in .NET Programming on 06-04-2012. Tags:

作者:牧山道人
原文地址: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(没测试),如果有需求,可以自己试试。

【赞赏 / Reward】

微信         支付宝         PayPal

Comments:

There are (2) Comments for the .NET ListView 闪烁问题的完美解决方法

Post a comment