C#使用ListView更新数据出现闪烁解决办法
C#使用ListView更新数据出现闪烁解决办法
在使用vs自动控件ListView控件时候,更新里面的部分代码时候出现闪烁的情况
如图:
解决以后:
解决办法使用双缓冲:添加新类继承ListView 对其重写
1 public class DoubleBufferListView : ListView 2 { 3 public DoubleBufferListView() 4 { 5 SetStyle(ControlStyles.DoubleBuffer | 6 ControlStyles.OptimizedDoubleBuffer | 7 ControlStyles.AllPaintingInWmPaint, true); 8 UpdateStyles(); 9 } 10 }
新建一个DemoTest测试
1.添加一个DoubleBufferListView的实例
DoubleBufferListView doubleBufferListView1= new DoubleBufferListView(); // // doubleBufferListView1 // this.doubleBufferListView1.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.doubleBufferListView1.FullRowSelect = true; this.doubleBufferListView1.HideSelection = false; this.doubleBufferListView1.Location = new System.Drawing.Point(50, 37); this.doubleBufferListView1.Name = "doubleBufferListView1"; this.doubleBufferListView1.Size = new System.Drawing.Size(400, 191); this.doubleBufferListView1.TabIndex = 2; this.doubleBufferListView1.UseCompatibleStateImageBehavior = false; this.doubleBufferListView1.View = System.Windows.Forms.View.Details;
2.将其添加到form窗体里面
this.Controls.Add(this.doubleBufferListView1);
3.给添加列
doubleBufferListView1.Clear(); doubleBufferListView1.Columns.Add("Action", 80, System.Windows.Forms.HorizontalAlignment.Left); doubleBufferListView1.Columns.Add("value", 80, System.Windows.Forms.HorizontalAlignment.Right); doubleBufferListView1.Columns.Add("Action", 80, System.Windows.Forms.HorizontalAlignment.Left); doubleBufferListView1.Columns.Add("value", 80, System.Windows.Forms.HorizontalAlignment.Left);
4.随便添加点内容
string[] listViewData = new string[4]; listViewData[0] = "Action"; listViewData[1] = "1"; listViewData[2] = "Action"; listViewData[3] = "1"; ListViewItem lvItem = new ListViewItem(listViewData, 0); doubleBufferView1.Items.Add(lvItem);
5.点击按钮开始运行
private void button1_Click(object sender, EventArgs e) { Thread th = new Thread(PlayGame); if (state == false) { state = true; button1.Text = "停止"; th.IsBackground = true; th.Name = "新线程"; th.Start(); } else { state = false; button1.Text = "开始"; } } private void PlayGame() { Random r = new Random(); while (state) { string temp = r.Next(0, 10).ToString(); label1.Text = temp; this.doubleBufferListView1.Items[0].SubItems[1].Text = temp; } }
6.运行对比图:
左侧是解决闪屏后,右侧是自带的ListView效果