a54546 发表于 2025-2-7 01:38:27

datagridview点击列头对当前列进行排序的功能无效

DataGridView 的默认行为是支持通过单击列头对列进行排序,但在以下情况下可能会取消该功能或无法使用:

1. 绑定的数据源不支持排序

如果 DataGridView 的数据源是绑定到一个不支持排序的集合(例如,List 或未实现 IBindingList 的对象),排序功能会被禁用。
2. 列的 SortMode 设置为 DataGridViewColumnSortMode.NotSortable

每列都有一个 SortMode 属性,默认值为 Automatic。如果将 SortMode 设置为 NotSortable,则禁用了点击列头排序功能。
3. 事件处理干扰了默认排序行为

如果在 ColumnHeaderMouseClick 事件中写了自定义代码,且未调用 DataGridView.Sort 方法,可能会导致排序功能被覆盖。
<hr>#### 当DataGridView 的数据源是List<T>的时候无法实现单击列头对列进行排序,需要手动写ColumnHeaderMouseClick事件实现单击列头排序

1.为当DataGridView添加ColumnHeaderMouseClick事件


2.ColumnHeaderMouseClick代码

private void dgvMain_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e){    string columnName = dgvMain.Columns.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);}
页: [1]
查看完整版本: datagridview点击列头对当前列进行排序的功能无效