o任飘零o

别人给了你一滴水,你给了别人些什么?
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

Posted on 2013-02-04 14:19  o任飘零o  阅读(893)  评论(0)    收藏  举报

 也许很多人也遇到这样的问题,连续不断向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++;
             }
}

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