C# WinForm DataGridView 点击标题排序功能
🏷️ C#
代码中使用 DataGridView
+ BindingSource
控件显示数据。DataSource
为自定义实体的 List
。
csharp
// 绑定属性表格
srcField.DataSource = currentColumns;
srcField.ResetBindings(true);
发现默认的排序没有作用 (默认列的 SortMode
为 Automatic
),需要自动手动写代码来实现排序。排序代码如下。
注意
需要注意的是绑定的列表在排序后已经变成了一个新的实体,需要重新绑定到 BindingSource
,否则 DataGridView
中的数据不会刷新。
另外需要在绑定后再设置标题的状态,否则状态会被重置为 None
。
csharp
private void grvField_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
//取得点击列的索引
int nColumnIndex = e.ColumnIndex;
if (!(grvField.Columns[nColumnIndex].SortMode == DataGridViewColumnSortMode.Programmatic))
{
return;
}
switch (grvField.Columns[nColumnIndex].HeaderCell.SortGlyphDirection)
{
case SortOrder.None:
//在这里加入排序的逻辑
currentColumns = currentColumns.OrderBy(column => typeof(ColumnModel)
.GetProperty(grvField.Columns[nColumnIndex].DataPropertyName).GetValue(column)).ToList();
srcField.DataSource = currentColumns;
srcField.ResetBindings(false);
//设置列标题的状态
grvField.Columns[nColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
break;
case SortOrder.Ascending:
//在这里加入排序的逻辑
currentColumns = currentColumns.OrderByDescending(column => typeof(ColumnModel)
.GetProperty(grvField.Columns[nColumnIndex].DataPropertyName).GetValue(column)).ToList();
srcField.DataSource = currentColumns;
srcField.ResetBindings(false);
//设置列标题的状态
grvField.Columns[nColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Descending;
break;
default:
currentColumns = currentColumns.OrderBy(column => typeof(ColumnModel)
.GetProperty(grvField.Columns[nColumnIndex].DataPropertyName).GetValue(column)).ToList();
srcField.DataSource = currentColumns;
srcField.ResetBindings(false);
grvField.Columns[nColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
break;
}
}
排序通过使用 linq
的 OrderBy
方法实现。
OrderBy
代理方法中根据点击列的 DataPropertyName
属性,通过反射获取 model 中该列的值。