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);        }    }


 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 分公司就三个人怎么办 转账支票作废后怎么办 干组织不是党员怎么办 宾馆客人逃房费怎么办 cad图太大打不开怎么办 cad文字输入不了怎么办 word打不了汉字怎么办 电脑浏览器卡顿怎么办 文档里输入不了怎么办 淘宝退款卖家不处理怎么办 抵押合同丢了怎么办 抵押合同丢失了怎么办 发票货物名称多怎么办 发票上少打一个字怎么办 发票名称带星号怎么办 小贷太多还不上怎么办 生日当天买保险怎么办 我挪用公司货款怎么办 车辆改名字保险怎么办 工伤报案周六日怎么办 五菱宏光s1门下沉怎么办 新手机版本更新怎么办 戴尔电脑开机黑屏怎么办 淘宝退货不发货怎么办 铝被酸腐蚀怎么办 新娘头饰氧化了怎么办 合金饰品变黑了怎么办 麻醉机fico2升高怎么办 快递被恶意投诉怎么办 顺风快递收件人拒收怎么办 手机联系人没了怎么办 收件人号码错了怎么办 收件人写错了怎么办 快递联系不到收件人怎么办 小孩烫伤有水泡怎么办 被烫伤的疤痕怎么办 微店别人下单后怎么办 月经超了七天怎么办 收件人不在指定地址怎么办 2017款宝来熄火后异响怎么办 我身高一八米怎么办呀