本文系原创,转载请注明出处:
https://blog.csdn.net/chengbao315/article/details/105172882前言:最近在工作中遇到一个给DataGridView控件排序的问题,使用时才发现原来控件没有这个功能,费劲周折总算实现了,这里记录一下我的探究过程。
一、DataGridView 控件对于列排序的支持
虽说DataGridView 控件不能直接实现对列的排序,但是它还是有一些支持列排序的方法。
- ColumnHeaderMouseClick 事件
通过鼠标点击列头事件,我们可以获取鼠标点击列的 Index 值和列排序信息,在处理方法中我们可以对列进行排序的处理。 - 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