关于DataGridView 控件列排序的探究

本文系原创,转载请注明出处:
https://blog.csdn.net/chengbao315/article/details/105172882

前言:最近在工作中遇到一个给DataGridView控件排序的问题,使用时才发现原来控件没有这个功能,费劲周折总算实现了,这里记录一下我的探究过程。

一、DataGridView 控件对于列排序的支持
虽说DataGridView 控件不能直接实现对列的排序,但是它还是有一些支持列排序的方法。

  1. ColumnHeaderMouseClick 事件
    通过鼠标点击列头事件,我们可以获取鼠标点击列的 Index 值和列排序信息,在处理方法中我们可以对列进行排序的处理。
  2. Sort方法
    在写程序的时候,我惊喜的发现,原来datagridview还有这么一个方法,入参分别是DataGridView 列(DataGridViewColumn)和排序顺序(ListSortDirection),尝试了一下,排序成功!

应用以上两个方法就可以实现DataGridView 列的排序功能,下面贴上我的实现代码:

	    //初始化方法,绑定数据
 		private void Init()
        {
            mTable.Columns.Add("Id", typeof(int));
            mTable.Columns.Add("Name", typeof(string));
            mTable.Columns.Add("Age", typeof(float));
            mTable.Columns.Add("Dept", typeof(string));
            mTable.Rows.Add(1, "Jack", 21, "C1");
            mTable.Rows.Add(2, "Rose", 24, "C2");
            mTable.Rows.Add(3, "Tom", 20, "C1");
            mTable.Rows.Add(4, "Micky", 28, "C3");
            mTable.Rows.Add(5, "Steven Chou", 18, "C1");

            dataGridView1.DataSource = mTable;
        }
		// 鼠标点击处理事件
        private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
         // 根据当前排序,处理排序方式
            switch (dataGridView1.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection)
            {
                case SortOrder.None:
                    break;
                case SortOrder.Ascending:
                  //调用排序方法
                    dataGridView1.Sort(dataGridView1.Columns[e.ColumnIndex], ListSortDirection.Ascending);
                 // 显示排序箭头                    
                    dataGridView1.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
                    break;
                case SortOrder.Descending:
                    dataGridView1.Sort(dataGridView1.Columns[e.ColumnIndex], ListSortDirection.Descending);
                    dataGridView1.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Descending;
                    break;
            }
        }

二、数据源绑定
上面代码的数据源是固定的 DataTable 类型,通常情况下我使用DataGridView 的习惯都是采用数据库查询结果+ 实体赋值的方式进行数据源绑定的,这样使用起来会更灵活,于是我对程序作了进一步的修改:
1.定义 Person类

	public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public float Age { get; set; }
        public string Department { get; set; }

        public Person(int id,string name,float age,string dep)
        {
            Id = id;
            Name = name;
            Age = age;
            Department = dep;
        }
    }

2.修改初始化方法

        private void Init()
        {
            List<Person> list = new List<Person>();
            list.Add(new Person(1, "Jack", 21, "C1"));
            list.Add(new Person(2, "Rose", 24, "C2"));
            list.Add(new Person(3, "Tom", 20, "C1"));
            list.Add(new Person(4, "Micky", 28, "C3"));
            list.Add(new Person(5, "Steven Chou", 18, "C1"));
            dataGridView1.DataSource = list;
        }

编译运行,本以为会顺利得到之前的排序效果,没想到编译器给我报了一个异常:
在这里插入图片描述
真是看的我一脸懵逼,异常的意思翻译过来大概就是“你这个数据源不支持排序”。百度了一下,原因是泛型会失去DateTable 排序的特性。那怎么办?凉凉了?在我的字典里肯定不存在的,于是我想到了两种解决方式:
1.自己写排序方法,不用控件自带的排序方法。
2.重写List 类型,实现System.Collections.Generic.IComparer< T> 类。
看起来挺复杂的,今天先写到这里吧。

如果本文有帮到你,记得加关注哦
源码地址:https://download.csdn.net/download/chengbao315/12253770
————————————————
版权声明:本文为CSDN博主「愤斗的程序猿」的原创文章,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chengbao315/article/details/105172882

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值