抛砖引玉——实现LISTVIEW点击COLUMN排序的代码,可实现按时间,字符,数字排序(控件部分)

using System;
using System.ComponentModel;
using System.Collections;
using System.Diagnostics;
using System.Windows.Forms;
using System.Drawing;

namespace ListViewControl
{
    /// <summary>
    /// Summary description for UserControl1.
    /// </summary>
    public class EastSpider : System.Windows.Forms.ListView
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        ///
        private Comparer myComparer;
        private ArrayList colTypes = new ArrayList();

        private System.ComponentModel.Container components = null;

        /// <summary>
        /// Sort Interface
        /// </summary>

        public class Comparer : IComparer
        {
            private int column;
            private int sign;
            private EastSpider.ColumnTypeEnum colType;

            public Comparer()
            {
                column = 0;
                sign = 1;
                colType = EastSpider.ColumnTypeEnum.ColumnTypeText;
            }

            public int Column
            {
                set
                {
                    column = value;
                }
                get
                {
                    return column;
                }
            }

            public int Sign
            {
                set
                {
                    sign = value;
                }
                get
                {
                    return sign;
                }
            }

            public ColumnTypeEnum ColType
            {
                set
                {
                    colType = value;
                }
                get
                {
                    return colType;
                }
            }

            public int Compare(object o1,object o2)
            {
                ListViewItem li1 = (ListViewItem)o1;
                ListViewItem li2 = (ListViewItem)o2;

                string s1,s2;

                try
                {
                    if (column == 0)
                    {
                        s1 = li1.Text;
                        s2 = li2.Text;

                        //return sign * String.Compare(s1,s2);
                    }

                    else
                    {
                        s1 = li1.SubItems[column].Text;
                        s2 = li2.SubItems[column].Text;
                    }

                    if (s1.Length == 0)
                    {
                        if (s2.Length > 0)
                        {
                            return (-sign);
                        }
                        else
                        {
                            return 0;
                        }
                    }
                    else if (s2.Length == 0)
                    {
                        return sign;
                    }

                    switch (colType)
                    {
                        case ColumnTypeEnum.ColumnTypeNumber:

                            long d1 = long.Parse(s1);
                            long d2 = long.Parse(s2);

                            if (d1 < d2)
                            {
                                return (-sign);
                            }
                            else if (d1 > d2)
                            {
                                return sign;
                            }
                            else
                            {
                                return 0;
                            }

                            
                        case ColumnTypeEnum.ColumnTypeDate:

                            DateTime t1 = DateTime.Parse(s1);
                            DateTime t2 = DateTime.Parse(s2);

                            return sign*DateTime.Compare(t1,t2);

                        default:

                            return sign * String.Compare(s1,s2);

                    }
                }
                catch
                {
                    return (0);
                }
            }
        }

        /// <summary>
        /// 排序类型
        /// </summary>

        [Category("SortType"),Description("The Sort Type of Column you wanted do")]

        public enum ColumnTypeEnum
        {
            ColumnTypeText = 0,
            ColumnTypeDate = 1,
            ColumnTypeNumber = 2
        }

        /// <summary>
        /// Clear All Items And Columns
        /// </summary>
        private void ClearAll()
        {
            Clear();
            ClearColumns();
        }

        /// <summary>
        /// Clear All Item
        /// </summary>
        private new void Clear()
        {
            base.Items.Clear();
        }

        /// <summary>
        /// Clear All Columns And ColType
        /// </summary>
        private void ClearColumns()
        {
            base.Columns.Clear();
            colTypes.Clear();
        }

        public void AddColumn(string caption,ColumnTypeEnum columnType,HorizontalAlignment ha,int width)
        {
            ColumnHeader ch = new ColumnHeader();
            ch.Text = caption;
            ch.TextAlign = ha;
            ch.Width = width;
            base.Columns.Add(ch);
            colTypes.Add(columnType);
        }

        /// <summary>
        /// Add Items
        /// </summary>
        /// <param name="item"></param>
        /// <param name="bgcolor"></param>
        /// <returns></returns>

        public int AddRow(ListViewItem item,Color bgcolor)
        {
            //ListViewItem li = new ListViewItem(args);
            item.UseItemStyleForSubItems = true;
            item.BackColor = bgcolor;
            Items.Add(item);
            return item.Index;
        }

        /// <summary>
        /// 点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        protected void ev_ColumnClick(object sender,System.Windows.Forms.ColumnClickEventArgs e)
        {
            //MessageBox.Show(e.Column.ToString());
            myComparer.Column = e.Column;
            myComparer.Sign = (base.Sorting == SortOrder.Ascending)? -1:1;
            myComparer.ColType = (ColumnTypeEnum)colTypes[e.Column];

            base.BeginUpdate();

            switch (base.Sorting)
            {
                case SortOrder.Ascending:
                    base.Sorting = SortOrder.Descending;
                    break;
                case SortOrder.Descending:
                    base.Sorting = SortOrder.Ascending;
                    break;
            }

            base.EndUpdate();
        }

        /// <summary>
        /// Override onclick
        /// </summary>
        /// <param name="e"></param>

        protected override void OnClick( System.EventArgs e)
        {
            base.OnClick(e);
        }

        /// <summary>
        /// Override OnMouseDown
        /// </summary>
        /// <param name="e"></param>

        protected override void OnMouseDown( System.Windows.Forms.MouseEventArgs e)
        {
            OnClick(e);
        }

        /// <summary>
        /// InitializeComponent
        /// </summary>

        public EastSpider()
        {
            // This call is required by the Windows.Forms Form Designer.

            base.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.ev_ColumnClick);
            myComparer = new Comparer();
            base.ListViewItemSorter = (IComparer)myComparer;

            //InitializeComponent();

            // TODO: Add any initialization after the InitForm call

        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                //if (components != null)
                //{
                //    components.Dispose();
                //}
            
                colTypes.Clear();
                base.Dispose(disposing);
            }
        }

        #region Component Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
        }
        #endregion
    }
}

时间: 2024-09-20 00:14:45

抛砖引玉——实现LISTVIEW点击COLUMN排序的代码,可实现按时间,字符,数字排序(控件部分)的相关文章

控件-delphi grid ,怎么实行行前面带选择框,行可以自由拖动进行排序?

问题描述 delphi grid ,怎么实行行前面带选择框,行可以自由拖动进行排序? 实现类似的效果,这是什么控件实现的? 解决方案 一.关于行选择框 建议在行的表格单元上,镶一个TCombobox,也可以选择,比较简单.像你说的选择框,比较复杂一点,须要镶一个容器(容器放选择框). 二.关于行可以自由排序 我的办法,在数据表中加入"排序"字段,在界面 加入两按键(上.下 ),点击按钮,是可以让单行上下移动,实现自由排序. 如果要拖拉排序,也是可以的,但代码量多比较复杂. 解决方案二:

C# 系统应用之ListView控件 (三).添加ContextMenuStrip右键菜单打开删除文件

        在前面讲述过使用TreeView控件和ListView控件显示磁盘目录信息,但仅仅是显示信息是不够的,我们还需要具体的操作.在"个人电脑使用历史痕迹"项目中我还需要添加"打开文件"和"删除文件"两种方法.具体如下:         在第一篇文章"C# 系统应用之TreeView控件 (一).显示树状磁盘文件目录及加载图标"中显示如下:         http://blog.csdn.net/eastmount

怎么在后台代码中访问ListView中&amp;amp;lt;EditItemTemplate&amp;amp;gt;模板中的控件?

问题描述 怎么在后台代码中访问ListView中<EditItemTemplate>模板中的控件?今天研究了很长时间,现在我可以通过以下后台代码访问<InsertItemTemplate>模板中控件:protectedvoidDropDownList1_SelectedIndexChanged(objectsender,EventArgse){DropDownListb=(DropDownList)ListView1.InsertItem.FindControl("Dro

在C#中实现对ListView点击列标题自动排序功能

先定义一个ListViewHelper类,代码如下: using System; using System.Collections; using System.Windows.Forms; namespace Common { /// <summary> /// 对ListView点击列标题自动排序功能 /// </summary> public class ListViewHelper { /// <summary> /// 构造函数 /// </summary

onitemclick-关于android中listview点击item没有反应

问题描述 关于android中listview点击item没有反应 public class MapActivity extends BasePagerActivity { private MapView mMapView = null; private BaiduMap mBaiduMap; private ListView map_menu_lv; @Override protected void onCreate(Bundle savedInstanceState) { // TODO A

【Android】 ListView点击时怎么才能只让背景图片变色,其余部分保持不变?

问题描述 [Android] ListView点击时怎么才能只让背景图片变色,其余部分保持不变? 大家可以看到,我在listview中的布局是两个按Vertical排列的TextView,小弟想实现类似微信上的效果,但是图片上可以看到,当点击Listview时整个布局都会被选中,而不是只选中仅仅包含图片的部分.所以想请教下怎么样才能实现?是否微信的效果不是用listview做的? PS:小弟初出茅庐,没有分可以悬赏,望各位大哥不吝赐教! 解决方案 1.你现在设置的点击内容是ListView的整个

如何点击form2上的button3刷新form1的listView控件?

问题描述 如何点击form2上的button3刷新form1的listView控件? 解决方案 解决方案二:比较标准的方式是使用委托解决方案三:用委托吧,论坛里老曹也发过窗体间传值的文章,自己看看吧解决方案四:具体怎样写??我现在是自学的,能不能详细点说说??解决方案五://form1中写个刷新listView的函数publicvoidRefreshListView(){.......}//form1中打开form2:form2form=newform2(this);form.Show();//

Android ListView中子控件的状态保存以及点击子控件改变子控件状态

这两天用到了ListView,写下遇到的一些问题.首先是ListView本身与子控件的焦点问题,比如我这里子控件用到了Button,在需要ListView中的根布局属性上加上下面的这一个属性: [html] view plaincopy android:descendantFocusability="blocksDescendants"   用于屏蔽子控件抢夺ListView的焦点,也可在Button本身设置焦点属性为false.其它的一些控件的点击问题就不说了,网上有很多. 然后是需

imageview-Android关于改变ListView里面的ImageView控件的背景图出现无法触发点击事件的问题

问题描述 Android关于改变ListView里面的ImageView控件的背景图出现无法触发点击事件的问题 问题说明:我使用AudioRecord进行录音,想要点击ImageView开始录音,然后根据音量大小设置ImageView背景图 ,由于ImageView是ListView的Item里面的一个子控件,于是我开启一个线程,使Thread.sleep(100);后 notifyDataSetChanged(),这时问题就出现了,当我再次点击ImageView想要录音暂停时,发现有时候点击事