C#彻底解决listview的闪屏问题

来源:互联网 发布:数控机床基本编程 编辑:程序博客网 时间:2024/06/04 20:06
也许很多人也遇到这样的问题,连续不断向listview中加载数据时界面会不停的闪烁,当你用listview.BeginUpdate();     listview.EndUpdate(); 虽然可以减轻一些,但也不能彻底消除闪屏。不信?可以试试下面的代码:
    public partial class Form1 : Form
    
{
        
private int counter = 0;
        
public Form1()
        
{
            InitializeComponent();
        }

        DoubleBufferListView lv 
= new DoubleBufferListView();

        ListView lv 
= new ListView();
        
private void Form1_Load(object sender, EventArgs e)
        
{
            timer1.Enabled 
= false;
            
this.Controls.Add(lv);            
            lv.View 
= View.Details;
            lv.GridLines 
= true;
            lv.BackColor 
= Color.Silver;
            lv.Columns.Add(
"aa");
            lv.Columns.Add(
"bb");
            lv.Columns.Add(
"cc");
            lv.Height 
= 300;
            lv.Width 
= 300;
            timer1.Enabled 
= true;
         }

        
private void timer1_Tick(object sender, EventArgs e)
        
{
            lv .Items.Add(counter.ToString());
            counter
++;
        }

     }

解决方法:

使用双缓冲,重写listview

class DoubleBufferListView : ListView
    
{
        
public DoubleBufferListView()
        
{
            SetStyle(ControlStyles.DoubleBuffer 
| ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
            UpdateStyles();
        }

    }
 
    
public partial class Form1 : Form
    
{
        
private int counter = 0;
        
public Form1()
        
{
            InitializeComponent();
        }

        DoubleBufferListView lv 
= new DoubleBufferListView();        
        
private void Form1_Load(object sender, EventArgs e)
        
{
            timer1.Enabled 
= false;
            
this.Controls.Add(lv);            
            lv.View 
= View.Details;
            lv.GridLines 
= true;
            lv.BackColor 
= Color.Silver;
            lv.Columns.Add(
"aa");
            lv.Columns.Add(
"bb");
            lv.Columns.Add(
"cc");
            lv.Height 
= 300;
            lv.Width 
= 300;
            timer1.Enabled 
= true;
        }

        
private void timer1_Tick(object sender, EventArgs e)
        
{
            lv .Items.Add(counter.ToString());
            counter
++;
        }

效果是不是很明显啊?呵呵。

参考:http://blog.csdn.net/jinjazz/archive/2007/12/05/1919359.aspx

 

原创粉丝点击