ListView 列标头排序

5 篇文章 0 订阅

在 msdn 示例上改的,可以对数字排序:

using System.Collections;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        ListView listview = new ListView();
        public Form1()
        {
            InitializeComponent();
            this.Size = new System.Drawing.Size(400, 300);
            listview.Dock = DockStyle.Fill;
            listview.Parent = this;
            
            //详细视图
            listview.View = View.Details;
            //选择总行
            listview.FullRowSelect = true;
            //设置 listview 的排序方法,在列标头事件中可以取出用来判断
            listview.Sorting = SortOrder.Ascending;
            //设置按第1列排序
            listview.ListViewItemSorter = new ListViewItemComparer(listview.Sorting, 1);

            listview.Columns.Add("名称", 80, HorizontalAlignment.Left);
            listview.Columns.Add("排名", 50, HorizontalAlignment.Center);
            listview.Columns.Add("描述", 200, HorizontalAlignment.Left);

            //添加测试数据
            ListViewItem lvi = new ListViewItem("AAA");
            lvi.SubItems.Add("1");
            lvi.SubItems.Add("哎,我是AAA");
            listview.Items.Add(lvi);

            lvi = new ListViewItem("BBB");
            lvi.SubItems.Add("2");
            lvi.SubItems.Add("啊,我是BBB");
            listview.Items.Add(lvi);

            lvi = new ListViewItem("CCC");
            lvi.SubItems.Add("3");
            lvi.SubItems.Add("这是CCC");
            listview.Items.Add(lvi);

            //添加列标题单击事件方法
            listview.ColumnClick += Listview_ColumnClick;
        }


        // listview 列标头单击事件方法。
        private void Listview_ColumnClick(object sender, ColumnClickEventArgs e)
        {
            if (listview.Sorting == SortOrder.Ascending)
            {
                listview.ListViewItemSorter = new ListViewItemComparer(SortOrder.Descending, e.Column);
                listview.Sorting = SortOrder.Descending;
            }
            else
            {
                listview.ListViewItemSorter = new ListViewItemComparer(SortOrder.Ascending, e.Column);
                listview.Sorting = SortOrder.Ascending;
            }
        }
    }


    //定义一个类,这个类实现 IComparer 接口
    class ListViewItemComparer : IComparer
    {
        private int col;
        private SortOrder sort = SortOrder.None;
        public ListViewItemComparer(SortOrder sortOrder)
        {
            col = 0;
        }
        public ListViewItemComparer(SortOrder sortOrder, int column)
        {
            sort = sortOrder;
            col = column;
        }

        //实现接口的 Compare 方法,x、y 为要比较的两个对象 
        public int Compare(object x, object y)
        {
            //默认升序。判断传入的排序枚举,如果为降序就对换要比较的对象
            if (sort == SortOrder.Descending)
            {
                object temp = x;
                x = y;
                y = temp;
            }

            string xx = ((ListViewItem)x).SubItems[col].Text;
            string yy = ((ListViewItem)y).SubItems[col].Text;

            int xxx = 0;
            int yyy = 0;

            //判断是否可以转换为数字,如果可以就按数字比较
            if (int.TryParse(xx.ToString(), out xxx) && int.TryParse(yy.ToString(), out yyy))
                return xxx.CompareTo(yyy);//按数字比较
            return string.Compare(xx, yy);//按字符比较
        }
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值