解决C#中LISTVIEW拖动时闪烁问题

本文探讨了C#中ListView控件在大量数据操作时出现闪烁现象的原因,并提供了两种有效的解决方案:一是通过设置ListView的双缓冲来减少闪烁;二是通过预创建数据项并批量添加的方式提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址: http://hi.baidu.com/susdisk/blog/item/ee133dcbf19417f553664f46.html
原文地址: http://blog.youkuaiyun.com/hfzsjz/archive/2008/12/15/3521631.aspx

这个问题网上有成型的解决方法,引起闪烁的问题有两个:

一,是加入删除大量数据引起。

二,是没有开启LISTVIEW的双缓存功能。

我需要用一个TIMER实时更新LISTVIEW,遇到的是第二个问题,重载LISTVIEW,写一个新组件,然后在FORM.DESIGNER文件里将LISTVIEW替换为这个类即可:

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


另外:加入删除大量数据

防止闪烁的ListView显示方案

相信做Win Form程序的朋友们一定遇到过在ListView中插入数据时,界面上一直在闪烁,而且速度很慢的情况吧。究其原因,还是在Windows消息机制没有使用好的原因。

本文对于ListView闪烁的原因,进行探究,并对于不同种的情况给出解决方案。

闪烁的原因

ListView闪烁的原因有以下几点或几种情况:
1:在数据多次插入间,存在时间间隔。
2:使用普通的Items.Add方法插入的数据量过大。
3:界面上有多个ListView在进行数据插入。

最根本的原因是因为,每次调用ListView实例进行插入的时候,都需要向系统发送一个窗口消息(相信做C++的朋友应该很清楚),然后窗口接到消息就会刷新对应控件的界面。所以,如果间隔时间长,或插入次数多,一定会闪烁的。
  防止闪烁的ListView显示方案 收藏 
The resolution of ListView Blink

防止闪烁的ListView显示方案

相信做Win Form程序的朋友们一定遇到过在ListView中插入数据时,界面上一直在闪烁,而且速度很慢的情况吧。究其原因,还是在Windows消息机制没有使用好的原因。

本文对于ListView闪烁的原因,进行探究,并对于不同种的情况给出解决方案。

闪烁的原因

ListView闪烁的原因有以下几点或几种情况:
1:在数据多次插入间,存在时间间隔。
2:使用普通的Items.Add方法插入的数据量过大。
3:界面上有多个ListView在进行数据插入。

最根本的原因是因为,每次调用ListView实例进行插入的时候,都需要向系统发送一个窗口消息(相信做C++的朋友应该很清楚),然后窗口接到消息就会刷新对应控件的界面。所以,如果间隔时间长,或插入次数多,一定会闪烁的。

 

解决方案

源码中实例的解决方案:

 

ListViewItem lvi;

            ListViewItem[] lvitems1 
=   new  ListViewItem[ 10000 ];

            
for  ( int  i  =   0 ; i  <   10000 ; i ++ )
            
{
                lvi 
= new ListViewItem(new string[] { i.ToString(), "22" });
                lvitems1[i] 
= lvi;
            }


            listViewTest.Items.AddRange(lvitems1);更通用的解决方法:

//  create a temp dataTable to store data
            DataTable dt  =   new  DataTable();
            DataRow dr;
            dt.Columns.Add(
" ID " typeof (String));
            dt.Columns.Add(
" Name " typeof (String));
            dt.Columns.Add(
" Class " typeof (String));
            dt.Columns.Add(
" Lesson " typeof (String));

         
foreach (item  in  dataSource)
         
{
                    dr 
= dt.NewRow();
                    dr[
0= item.ID; // ID 
                    dr[1= item.Name;  // Name
                    dr[2= item.Class;  // Class
                    dr[3= item.Lesson;  // Lesson

                    dt.Rows.Add(dr);

         }


            
//  loop the temp table , and insert to ListView

            
int  i  =   0 ;
            
while (iint iSize  =  (dt.Rows.Count - i) > 1000 ? 1000 :(dt.Rows.Count - i);
                            
                ListViewItem lvi;

                ListViewItem[] lvitems 
=   new  ListViewItem[iSize];

                
for  ( int  j  =   0 ; j  <  iSize; j ++ )
                
{
                    lvi 
= new ListViewItem(new string[] { dt.Rows[i+j][0].ToString(), dt.Rows[i+j][1].ToString(), dt.Rows[i+j][2].ToString(), dt.Rows[i+j][3].ToString() });
                    lvitems[i] 
= lvi;
                }


                listViewTest.Items.AddRange(lvitems);

                i 
=  i  +  iSize;
            }


主要思路是,建一个临时的Table,然后,把数据插入到这个临时表中;在处理结束之后,使用Items.AddRange方法把数据分块插入到ListView。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值