zoukankan      html  css  js  c++  java
  • ListView用法及加载数据时的闪烁问题和加载数据过慢问题

    ListView介绍及添加数据时的闪烁问题

    1.     ListView类

    1.1 ListView常用的基本属性:

    (1)FullRowSelect:设置是否行选择模式。(默认为false) 提示:只有在Details视图该属性才有意义。

    (2) GridLines:设置行和列之间是否显示网格线。(默认为false)提示:只有在Details视图该属性才有意义。

    (3)AllowColumnReorder:设置是否可拖动列标头来对改变列的顺序。(默认为false)提示:只有在Details视图该属性才有意义。

    (4)View:获取或设置项在控件中的显示方式,包括Details、LargeIcon、List、SmallIcon、Tile(默认为 LargeIcon)

    (5)MultiSelect:设置是否可以选择多个项。(默认为false)

    (6)HeaderStyle:获取或设置列标头样式。Clickable:列标头的作用类似于按钮,单击时可以执行操作(例如排序)。NonClickable:列标头不响应鼠标单击。None:不显示列标头。
    (7)LabelEdit:设置用户是否可以编辑控件中项的标签,对于Detail视图,只能编辑行第一列的内容。(默认为false)

    (8)CheckBoxes:设置控件中各项的旁边是否显示复选框。(默认为false)

    (9)LargeImageList:大图标集。提示:只在LargeIcon视图使用。

    (10)SmallImageList:小图标集。提示:只有在SmallIcon视图使用。

    (11)StateImageList:图像蒙板。这些图像蒙板可用作LargeImageList和SmallImageList图像的覆盖图,这些图像可用于指示项的应用程序定义的状态。(暂时不大懂)

    (12)SelectedItems:获取在控件中选定的项。

    (13)CheckedItems:获取控件中当前复选框选中的项。

    (14)Soritng对列表视图的项进行排序。(默认为None)

    Ascending:项按递增顺序排序。

    Descending:项按递减顺序排序。

    None:项未排序。

    (15)Scrollable:设置当没有足够空间来显示所有项时是否显示滚动条。(默认为true)

    (16)HoverSelection:设置当鼠标指针悬停于项上时是否自动选择项。(默认为false)

    (17)HotTracking:设置当鼠标指针经过项文本时,其外观是否变为超链接的形式。(默认为false)

    (18)HideSelection:设置选定项在控件没焦点时是否仍突出显示。(默认为false)

    (19)ShowGroups:设置是否以分组方式显示项。(默认为false);

    (20)Groups:设置分组的对象集合。

    (21)TopItem:获取或设置控件中的第一个可见项,可用于定位。(效果类似于EnsureVisible方法)

    1.2 常用方法:

    (1)BeginUpdate:避免在调用EndUpdate 方法之前描述控件。当插入大量数据时,可以有效地避免控件闪烁,并能大大提高速度。

    (2)EndUpdate:在BeginUpdate 方法挂起描述后,继续描述列表视图控件。(结束更新)

    (3)EnsureVisible:列表视图滚动定位到指定索引项的选项行。(效果类似于TopItem属性)

    (4)FindItemWithText:查找以给定文本值开头的第一个 ListViewItem。

    (5)FindNearestItem:按照指定的搜索方向,从给定点开始查找下一个项。提示:只有在LargeIcon或SmallIcon视图才能使用该方法。

    1.3 常用事件:

    (1)AfterLabelEdit:当用户编辑完项的标签时发生,需要LabelEdit属性为true。

    (2)BeforeLabelEdit:当用户开始编辑项的标签时发生。

    (3)ColumnClick:当用户在列表视图控件中单击列标头时发生。

     

    2.     关于ListView闪烁问题

    ListView在动态加载大量数据是,会出现闪烁问题,而且加载数据的速度慢。

    方法1:自定义ListView

    然后在定义ListView的地方 将ListView  listView1 ,改为MyListView listView1;这样就不会出现闪烁了。

    public class MyListView: ListView

        {

            public MyListView()

            {

                // 开启双缓冲

                this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);

     

                this.SetStyle(ControlStyles.EnableNotifyMessage, true);

            }

     

            protected override void OnNotifyMessage(Message m)

            {

                if (m.Msg != 0x14)

                {

                    base.OnNotifyMessage(m);

                }

            }

        }

    虽然解决了ListView闪烁的问题,但是在打开速度上和原来没什么区别,同时带来一个问题就是如果程序切换到别的ListView上,数据还会继续忘原来的ListView中添加,直到数据全面添加完成。

    方法2 开启ListView的VirtualMode模式

    可以实现不闪烁效果,而且打开速度很快。往往好的效果带来的问题是代码较为复杂,具体写法可以看官方示例 http://msdn.microsoft.com/zh-cn/library/system.windows.forms.listview.virtualmode.aspx,或者http://www.cnblogs.com/hcfalan/archive/2008/07/08/1238493.html,下面说下需要注意的几点:

    (1)必须设置VirtualMode为true并设置VirtualListSize大小

    listView1.VirtualMode = true;
    listView1.VirtualListSize = bufferItems.Count;
    listView1.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView_RetrieveVirtualItem);

    (2)绑定该事件为ListView计算Item

    void listView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
    {
        e.Item = m_hListViewItems[e.ItemIndex];
    }

    (3)如果中间更新了数据需要重新设置VirtualListSize,并调用Invalidate()方法(此方法并非必须请高手指点)。

    listView1.VirtualListSize = bufferItems.Count;
    listView1.Invalidate();

    (4)禁用selectedItem,在该模式下使用selectedItem将产生异常,可以用下面方法代替

    private List<ListViewItem> FindSelectedAll()
    {
        List<ListViewItem> r = new List<ListViewItem>();
        foreach (int item in listView1.SelectedIndices)
        {
             r.Add(bufferItems[item]);
         }
         return r;
     }

  • 相关阅读:
    LeetCode OJ String to Integer (atoi) 字符串转数字
    HDU 1005 Number Sequence(AC代码)
    HDU 1004 Let the Balloon Rise(AC代码)
    HDU 1003 Max Sum(AC代码)
    012 Integer to Roman 整数转换成罗马数字
    011 Container With Most Water 盛最多水的容器
    010 Regular Expression Matching 正则表达式匹配
    007 Reverse Integer 旋转整数
    006 ZigZag Conversion
    005 Longest Palindromic Substring 最长回文子串
  • 原文地址:https://www.cnblogs.com/kest/p/4657048.html
Copyright © 2011-2022 走看看