ListView虚拟模式的使用
来源:互联网 发布:淘宝买客户资料 编辑:程序博客网 时间:2024/06/07 16:55
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms;using System.Data;namespace app_ListView{ public class ListViewEx : ListView { #region 虚拟模式相关操作 ///<summary> /// 前台行集合 ///</summary> public List<ListViewItem> CurrentCacheItemsSource; public ListViewEx() { this.CurrentCacheItemsSource = new List<ListViewItem>(); this.VirtualMode = true; this.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView_RetrieveVirtualItem); } ///<summary> /// 重置listview集合 ///</summary> ///<param name="l"></param> public void ReSet(IList<ListViewItem> l) { this.CurrentCacheItemsSource.Clear(); this.CurrentCacheItemsSource = new List<ListViewItem>(); foreach (var item in l) { this.CurrentCacheItemsSource.Add(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 == 0) { return; } ListViewItem lv = this.CurrentCacheItemsSource[e.ItemIndex]; e.Item = lv; } ///<summary> /// 获取选中的第一行的指定tag值 ///</summary> ///<param name="key"></param> ///<returns></returns> public string FirstSelectItemValue(string key) { int i = GetColumnsIndex(key); return this.CurrentCacheItemsSource[this.SelectedIndices[0]].SubItems[i].Text; } ///<summary> /// 获取列名的索引 ///</summary> ///<param name="key"></param> ///<returns></returns> public int GetColumnsIndex(string key) { int i = 0; 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>(); 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); string dbType = this.Columns[e.Column].Tag.ToString(); if (this.mySorter == null) { this.mySorter = new ListViewItemComparer(e.Column, SortOrder.Ascending, dbType); } 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.mySorter.DbType = dbType; this.CurrentCacheItemsSource.Sort(this.mySorter); this.Invalidate(); } } #endregion #region 普通模式下排序 /*普通模式下排序 public void ReLoadColumn() { this.ListViewItemSorter = new ListViewItemComparer(0, SortOrder.Ascending, this.Columns[0].Tag.ToString()); } protected override void OnColumnClick(ColumnClickEventArgs e) { base.OnColumnClick(e); string dbType = this.Columns[e.Column].Tag.ToString(); if (this.ListViewItemSorter == null) { this.ListViewItemSorter = new ListViewItemComparer(e.Column, SortOrder.Ascending, dbType); } else { ListViewItemComparer comparer = this.ListViewItemSorter as ListViewItemComparer; if (comparer.SortColumn == e.Column) { if (comparer.Order == SortOrder.Ascending) { comparer.Order = SortOrder.Descending; } else { comparer.Order = SortOrder.Ascending; } } else { comparer.SortColumn = e.Column; comparer.Order = SortOrder.Ascending; } //MessageBox.Show(dbType); comparer.DbType = dbType; //仅仅改变了ListViewItemSorter属性值,这里不会自动调用Sort()方法,需要显式指定执行Sort()方法实现排序。 this.Sort(); } } */ #endregion #region ListView排序逻辑 ///<summary> /// ListView排序逻辑 ///</summary> private class ListViewItemComparer : System.Collections.Generic.IComparer<ListViewItem> { public string DbType; public ListViewItemComparer() { this.SortColumn = 0; this.Order = SortOrder.None; } public ListViewItemComparer(int column) : this() { this.SortColumn = column; } ///<summary> /// ///</summary> ///<param name="column">哪列</param> ///<param name="sortOrder">排序方式</param> ///<param name="dbType">类型</param> public ListViewItemComparer(int column, SortOrder sortOrder, string dbType) : this(column) { Order = sortOrder; DbType = dbType.ToLower(); } #region IComparer 成员 public int Compare(ListViewItem x, ListViewItem y) { int result = 0; 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 0; } switch (DbType) { case "int": result = Fn.IsInt(c1, 0) - Fn.IsInt(c2, 0); break; case "datetime": DateTime t1 = Fn.IsDate(c1, DateTime.MinValue); DateTime t2 = Fn.IsDate(c2, DateTime.MinValue); if (DateTime.TryParse(c1, out t1) && DateTime.TryParse(c2, out t2)) { int cha1 = Fn.IsInt((t1 - t2).TotalSeconds.ToString(), 0); result = Fn.IsInt((t1 - t2).TotalSeconds.ToString(), 0); if (cha1 == 0) result = 0; else if (cha1 < 0) result = -1; else result = 1; } else { result = string.Compare(c1, c2); } break; case "double": double d1 = Fn.IsDouble(c1, 0); double d2 = Fn.IsDouble(c2, 0); if (d1 == d2) result = 0; else if (d1 < d2) result = -1; else result = 1; break; default: result = string.Compare(c1, c2); break; } if (this.Order == SortOrder.Ascending) { return result; } else if (this.Order == SortOrder.Descending) { return (-result); } else { return 0; } } #endregion ///<summary> /// 当前排序列 ///</summary> public int SortColumn { get; set; } ///<summary> /// 当前列排序方式 ///</summary> public SortOrder Order { get; set; } } #endregion public void Fill_Lv(DataSet ds) { this.View = View.Details; this.FullRowSelect = true; this.GridLines = true; DataTable table = ds.Tables[0]; if (ds != null && ds.Tables.Count > 0) { foreach (DataColumn col in table.Columns) { ColumnHeader ch = new ColumnHeader(); ch.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; ch.Text = col.Caption; ch.Width = 100; this.Columns.Add(ch); } List<ListViewItem> lstItem = new List<ListViewItem>(); foreach (DataRow dr in table.Rows) { string[] str = new string[table.Columns.Count]; for (int i = 0; i < table.Columns.Count; i++) { str[i] = dr[i].ToString(); } ListViewItem lst1 = new ListViewItem(str, 0); //lst1.ImageIndex = Convert.ToInt32(dr["Ste"]); lstItem.Add(lst1); } AddLVRow(lstItem); } this.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); this.Columns[this.Columns.Count - 1].Width -= 50; } protected void AddLVCol(string pName, string pTag, string pText, int pWidth) { ColumnHeader ch = new ColumnHeader(); ch.Name = pName; ch.Tag = pTag; ch.Text = pText; ch.Width = pWidth; this.Columns.Add(ch); } protected void AddLVRow(List<ListViewItem> lvItem) { this.ReSet(lvItem); } } public static class Fn { public static int IsInt(object obj1, int i1) { try { return Convert.ToInt32(obj1); } catch (System.Exception ex) { return i1; } } public static double IsDouble(object obj1, double d1) { try { return Convert.ToDouble(obj1); } catch (System.Exception ex) { return d1; } } public static DateTime IsDate(object obj1, DateTime datTim1) { try { return Convert.ToDateTime(obj1); } catch (System.Exception ex) { return datTim1; } } }}
使用方法:
public partial class Form1 : Form { ListViewEx lv1 = new ListViewEx(); CADO ado1 = new CADO(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { lv1.Parent = this; lv1.Dock = DockStyle.Fill; lv1.Show(); DataSet ds1 = ado1.sel1("select top 1000 * from tabTimeData"); lv1.Fill_Lv(ds1); } }
- ListView虚拟模式的使用
- ListView的虚拟模式
- listview使用虚拟模式显示海量数据
- Winform ListView虚拟模式
- ListView 虚拟模式2
- ListView虚拟模式
- 【Winform】ListView虚拟模式与普通模式的性能对比
- Winform ListView虚拟模式小结
- 【Winform】ListView虚拟模式与普通模式的性能对比 -- 深入分析
- 【Android】ListView多选模式的使用
- DataGridView中虚拟模式(Virtual Mode)的使用
- DataGridView中虚拟模式(Virtual Mode)的使用
- ListView虚拟模式加载数据 提高加载速度
- WinForm ListView虚拟模式加载数据 提高加载速度
- C#为listview设置虚拟模式用于导入excel表
- ListView的单选和多选模式的使用
- ListView的适配器模式
- ListView的选择模式
- 备忘——变量交换的效率
- ERP系统容灾方案析投入产出比例与维护管理成本分析
- Canny算子提取边缘Matlab源代码
- Django的模板系统
- gridview固定表头--纵向固定横向滚动
- ListView虚拟模式的使用
- Address already in use: JVM_Bind<null>:80 解决方案
- UNIX网络编程——SOCKET API和TCP STATE的对应关系_三次握手_四次挥手及TCP延迟确认
- Java加密技术(四)——非对称加密算法RSA
- android系统编译过程中报64-bit linux的错误
- ORACLE 10g 静默安装
- Dalvik虚拟机简要介绍和学习计划
- java方法的覆盖
- SQL执行计划