DataGridView 的默认行为是支持通过单击列头对列进行排序,但在以下情况下可能会取消该功能或无法使用:
1. 绑定的数据源不支持排序
如果 DataGridView 的数据源是绑定到一个不支持排序的集合(例如,List
2. 列的 SortMode 设置为 DataGridViewColumnSortMode.NotSortable
每列都有一个 SortMode 属性,默认值为 Automatic。如果将 SortMode 设置为 NotSortable,则禁用了点击列头排序功能。
3. 事件处理干扰了默认排序行为
如果在 ColumnHeaderMouseClick 事件中写了自定义代码,且未调用 DataGridView.Sort 方法,可能会导致排序功能被覆盖。
#### 当DataGridView 的数据源是List的时候无法实现单击列头对列进行排序,需要手动写ColumnHeaderMouseClick事件实现单击列头排序
1.为当DataGridView添加ColumnHeaderMouseClick事件
2.ColumnHeaderMouseClick代码
private void dgvMain_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{string columnName = dgvMain.Columns[e.ColumnIndex].DataPropertyName; // 获取绑定的字段名称var dataSource = bsMain.DataSource as List<GroupedKanBanInfo>;//List<T>,实际情况换成需要的实体类if (dataSource == null) return;// 根据列名排序,支持升序和降序if (dgvMain.Tag == null || dgvMain.Tag.ToString() != columnName) // 默认升序{bsMain.DataSource = dataSource.OrderBy(item => GetPropertyValue(item, columnName)).ToList();dgvMain.Tag = columnName; // 保存当前排序列,用于下次判断}else // 切换为降序{bsMain.DataSource = dataSource.OrderByDescending(item => GetPropertyValue(item, columnName)).ToList();dgvMain.Tag = null; // 重置}bsMain.ResetBindings(false);
}// 通用的获取属性值方法
private object GetPropertyValue(object obj, string propertyName)
{if (obj == null || string.IsNullOrEmpty(propertyName)) return null;var prop = obj.GetType().GetProperty(propertyName);return prop?.GetValue(obj);
}