public class ListViewAH : ListViewEx
{
#region 虚拟模式相关操作 ///<summary>
/// 前台行集合
///</summary>
public List<ListViewItem> CurrentCacheItemsSource
{ get; private set; } public ListViewAH()
{
this.CurrentCacheItemsSource = new List<ListViewItem>();
this.VirtualMode = true;
this.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView_RetrieveVirtualItem);
} ///<summary>
/// 重置listview集合
///</summary>
///<param name="items"></param>
public void ReSet(IList<ListViewItem> items)
{
this.CurrentCacheItemsSource.Clear();
this.CurrentCacheItemsSource = new List<ListViewItem>();
if ( null != items )
{
if ( items.Count > )
{
foreach ( var item in items )
{
this.CurrentCacheItemsSource.Add(item);
}
}
this.VirtualListSize = this.CurrentCacheItemsSource.Count;
}
else
this.VirtualListSize = ;
} /// <summary>
/// 追加项
/// </summary>
/// <param name="l"></param>
public void AppendListViewItem(IList<ListViewItem> l)
{
if ( this.CurrentCacheItemsSource == null || this.CurrentCacheItemsSource.Count <= )
{
ReSet(l);
return;
}
foreach ( var item in l )
{
this.CurrentCacheItemsSource.Add(item);
}
this.VirtualListSize = this.CurrentCacheItemsSource.Count;
} /// <summary>
/// 清空所有项
/// </summary>
public void ClearAllItem()
{
if ( this.CurrentCacheItemsSource == null || this.CurrentCacheItemsSource.Count <= )
{
return;
}
this.CurrentCacheItemsSource.Clear();
this.VirtualListSize = this.CurrentCacheItemsSource.Count;
} /// <summary>
/// 移除当前选中的项
/// </summary>
/// <param name="l"></param>
public void RemoveListViewItem(IList<ListViewItem> l)
{
if ( this.CurrentCacheItemsSource == null || this.CurrentCacheItemsSource.Count <= )
{
return;
}
foreach ( var item in l )
{
this.CurrentCacheItemsSource.Remove(item);
}
this.VirtualListSize = this.CurrentCacheItemsSource.Count;
} ///<summary>
/// 虚拟模式事件
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
private void listView_RetrieveVirtualItem(object sender , RetrieveVirtualItemEventArgs e)
{
if ( this.CurrentCacheItemsSource == null || this.CurrentCacheItemsSource.Count == )
{
return;
} ListViewItem lv = this.CurrentCacheItemsSource[e.ItemIndex];
e.Item = lv;
} ///<summary>
/// 获取选中的第一行的文本值
///</summary>
///<param name="key"></param>
///<returns></returns>
public string FirstSelectItemValue(string key)
{
int i = GetColumnsIndex(key); return this.CurrentCacheItemsSource[this.SelectedIndices[]].SubItems[i].Text;
} ///<summary>
/// 获取列名的索引
///</summary>
///<param name="key"></param>
///<returns></returns>
public int GetColumnsIndex(string key)
{
int i = ;
for ( ; i < this.Columns.Count ; i++ )
{
if ( this.Columns[i].Name == key )
{
break;
}
} return i;
} ///<summary>
/// 获取选中项
///</summary>
///<returns></returns>
public List<ListViewItem> GetSelectItem()
{
List<ListViewItem> l = new List<ListViewItem>();
if ( this.SelectedIndices.Count <= ) return null;
foreach ( var item in this.SelectedIndices )
{
l.Add(this.CurrentCacheItemsSource[int.Parse(item.ToString())]);
}
return l;
} ///<summary>
/// 获取选中行的某列集合
///</summary>
///<param name="key"></param>
///<returns></returns>
public List<string> GetListViewField(string key)
{
List<string> ids = new List<string>(); foreach ( var item in this.SelectedIndices )
{
string id = this.CurrentCacheItemsSource[int.Parse(item.ToString())].SubItems[GetColumnsIndex(key)].Text;
ids.Add(id);
}
return ids;
} private ListViewItemComparer mySorter;
///<summary>
/// 排序
///</summary>
///<param name="e"></param>
protected override void OnColumnClick(ColumnClickEventArgs e)
{
base.OnColumnClick(e); if ( this.mySorter == null )
{
this.mySorter = new ListViewItemComparer(e.Column , SortOrder.Ascending);
}
else
{
if ( this.mySorter.SortColumn == e.Column )
{
if ( this.mySorter.Order == SortOrder.Ascending )
{
this.mySorter.Order = SortOrder.Descending;
}
else
{
this.mySorter.Order = SortOrder.Ascending;
}
}
else
{
this.mySorter.SortColumn = e.Column;
this.mySorter.Order = SortOrder.Ascending;
} this.CurrentCacheItemsSource.Sort(this.mySorter); this.Invalidate();
}
}
#endregion #region ListView排序逻辑
///<summary>
/// ListView排序逻辑
///</summary>
private class ListViewItemComparer : System.Collections.Generic.IComparer<ListViewItem>
{
public ListViewItemComparer()
{
this.SortColumn = ;
this.Order = SortOrder.None;
} public ListViewItemComparer(int column)
: this()
{
this.SortColumn = column;
} ///<summary>
///
///</summary>
///<param name="column">哪列</param>
///<param name="sortOrder">排序方式</param>
public ListViewItemComparer(int column , SortOrder sortOrder)
: this(column)
{
Order = sortOrder;
} #region IComparer 成员
public int Compare(ListViewItem x , ListViewItem y)
{
int result = ;
string c1 = "";
string c2 = ""; try
{
c1 = x.SubItems[this.SortColumn].Text;
c2 = y.SubItems[this.SortColumn].Text;
}
catch ( Exception ex )
{
// MessageBox.Show(ex.Message);
return ;
}
result = string.Compare(c1 , c2);
if ( this.Order == SortOrder.Ascending )
{
return result;
}
else if ( this.Order == SortOrder.Descending )
{
return ( -result );
}
else
{
return ;
}
}
#endregion ///<summary>
/// 当前排序列
///</summary>
public int SortColumn
{
get;
set;
} ///<summary>
/// 当前列排序方式
///</summary>
public SortOrder Order
{
get;
set;
}
}
#endregion
}

使用listView普通模式加载大数据,会比较慢,即时使用线程加载,也会出现不断的刷新,故用虚拟模式下加载,速度快

本例中继承第三方控件的ListViewEx控件,也可以继承系统自带的ListView

ListView虚拟模式封装的更多相关文章

  1. WinForm ListView虚拟模式加载数据 提高加载速度

    将VirtualMode 属性设置为 true 会将 ListView 置于虚拟模式.控件不再使用Collection.Add()这种方式来添加数据,取而代之的是使用RetrieveVirtualIt ...

  2. 实现虚拟模式的动态数据加载Windows窗体DataGridView控件 .net 4.5 (一)

    实现虚拟模式的即时数据加载Windows窗体DataGridView控件 .net 4.5 原文地址 :http://msdn.microsoft.com/en-us/library/ms171624 ...

  3. Skyline基本操作模式封装

    skyline基本操作模式 项目中基于skyline的浏览器插件进行二次开发,基本的业务操作模式如下: 工具栏:点击工具栏某个功能,开启操作模式. onFrame:鼠标移动预选对象,在能够拾取或者选定 ...

  4. HeadFirst设计模式笔记:(六)命令模式 —— 封装调用

    1.概念 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化.分离变化与不变的因素. 在面向对象的程序 ...

  5. 【Android】策略模式封装百度地图路线规划模块

    百度地图的Demo里有个路线规划的功能,但是,这个功能和Activity耦合性太高,所以需要单独抽离出路径规划功能,进行"解耦". 注:由于项目原因,本文只针对驾车路线规划进行封装 ...

  6. js原生设计模式——9外观模式封装

    1.事件处理程序兼容性封装 <!DOCTYPE html><html lang="en"><head>    <meta charset= ...

  7. js原生设计模式——3简单工厂模式\简单工厂模式封装简单对象

    1.Factory基本写法 <!DOCTYPE html><html lang="en"><head>    <meta charset= ...

  8. PO页面对象模式封装

    PO的主要价值体现在对界面交互细节的封装,这样可以使测试案例可以更关注与业务而非界面细节,提高测试案例的可读性.   以传统的登陆页面为例實現PO模式,因为每个用例中都需要登陆. 其中需要使用Page ...

  9. Facade 门面模式 封装 MD

    门面模式 简介 作用:封装系统功能,简化系统调用 门面模式要求一个系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行.门面模式提供一个高层次的接口,使得系统更易于使用. 门面模式的 ...

随机推荐

  1. Java编程基础-面向对象(下)

    一.抽象类 1.引入:当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法的实现方式是无法确定的.Java允许在定义方法时不写方法体,不包含方法体的方法为抽象方法,抽象方法必须使用 ...

  2. Android ScrollView嵌套RecyclerView导致在三星s8曲面屏显示不全问题

    当RecyclerView适配显示不全时可以单独给其嵌套一个相对布局!!!(必须是相对布局),这样在曲面屏手机就可以全部显示出来如下图所示 <RelativeLayout android:lay ...

  3. Objective-C Numbers

    In Objective-C programming language, in order to save the basic data types like int, float, bool in ...

  4. Xcode 升级后,cocoaPod 问题

    当我从Xcode 6.3切换到Xcode6.4的时候,因为我是mac上安装了两个不同的版本,现在把Xcode 6.3卸掉了. 现在再次运行pod install命令的时候,提示如下错误:   Upda ...

  5. Azure 项目构建 - 构建 WordPress 网站

    本课程主要介绍了如何基于 Azure Web 应用和 WordPress 快速构建网站,实践讲解如何使用 Azure Web 应用,创建并连接 MySQL Database on Azure, 使用 ...

  6. hihoCoder #1162 : 骨牌覆盖问题·三 (矩阵快速幂,DP)

    题意:有一个k*n的棋盘,要求用1*2的骨牌来铺满,有多少种方案?(k<8,n<100000001) 思路: 由于k是比较小,但是又不那么小,可以专门构造这样的一个矩阵M,使得只要我们有一 ...

  7. 11gR2新特性---Gpnp守护进程

    在这篇文章中,我们会对11gR2 新的守护进程(资源名称ora.gpnpd)进行介绍,其中包含的gpnp的功能,启动顺序和基本的诊断方法. gpnp全称为grid plug and play,该组件的 ...

  8. SQL与脚本语言

    SQL是人类与数据库沟通的语言https://zhidao.baidu.com/question/413397944.html我个人认为SQL是一种专门对数据库进行操作的特殊的脚本语言.因为SQL语句 ...

  9. dinner 后台 nodemon 部署 Koa (关闭everything 安装或排除node_modules) # mysql 没开192.168.x.x 需要设置一下 #Navicat Premium,mysql 数据库版本有要求:mysql-5.7.17.msi 对??的支持

    tip1:新建数据库 记得选 字符集和排序规则 utf8 -- UTF-8 Unicode utf8_general_ci 后台链接部分 1. 全局管理员安装 nodemon,后台热部署(右键 管理员 ...

  10. insert size|single-read|Paired-end|Mate-pair

    (测序方面):测三只大熊猫:得到的insert size有150bp,500bp,2kb,5kb和10kb这四种,可测得序列长度和平均reads长度. 为什么average reads这么短? 因为i ...