• DataGridView可以点击列排序 Sort(使用BindingList改写)


    1.DGV排序列要求设定

     public SortableBindingList<Record> record_list = new SortableBindingList<Record> { };
     dataGridView.DataSource = record_list;
     this.dataGridView.Sort(this.dataGridView.Columns["UserName"], ListSortDirection.Ascending);
    
    • 1
    • 2
    • 3

    2.另一种参考

    datagridview的数据显示一般是通过数据绑定来实现,

       this.datagridview.DataSource=this.bindingSrc; 
       this.bindingSrc.DataSource=this.Model; 
    
    • 1
    • 2

    参考: https://www.cnblogs.com/soundcode/p/9507506.html
    3.直接重写绑定(就会出现箭头排序)

    dataGridView.DataSource = new SortableBindingList<T>(list);
    
    • 1

    参考:https://www.cnblogs.com/Lucen/archive/2010/01/15/1648511.html

    1. 重写BindingList
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    public class SortableBindingList<T> : BindingList<T>
    {
        private bool isSortedValue;
        ListSortDirection sortDirectionValue;
        PropertyDescriptor sortPropertyValue;
        public SortableBindingList() : base() { }
        public SortableBindingList(IList<T> list) : base(list) { }
        protected override void ApplySortCore(PropertyDescriptor prop,
            ListSortDirection direction)
        {
            Type interfaceType = prop.PropertyType.GetInterface("IComparable");
            if (interfaceType == null && prop.PropertyType.IsValueType)
            {
                Type underlyingType = Nullable.GetUnderlyingType(prop.PropertyType);
                if (underlyingType != null)
                {
                    interfaceType = underlyingType.GetInterface("IComparable");
                }
            }
            if (interfaceType != null)
            {
                sortPropertyValue = prop;
                sortDirectionValue = direction;
                IEnumerable<T> query = base.Items;
                if (direction == ListSortDirection.Ascending)
                    query = query.OrderBy(i => prop.GetValue(i));
                else
                    query = query.OrderByDescending(i => prop.GetValue(i));
                int newIndex = 0;
                foreach (object item in query)
                {
                    this.Items[newIndex] = (T)item;
                    newIndex++;
                }
                isSortedValue = true;
                sorting = true;
                this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
                sorting = false;
            }
            else
            {
                throw new NotSupportedException("Cannot sort by " + prop.Name +
                    ". This" + prop.PropertyType.ToString() +
                    " does not implement IComparable");
            }
        }
        bool sorting = false;
        protected override PropertyDescriptor SortPropertyCore
        {
            get { return sortPropertyValue; }
        }
        protected override ListSortDirection SortDirectionCore
        {
            get { return sortDirectionValue; }
        }
        protected override bool SupportsSortingCore
        {
            get { return true; }
        }
        protected override bool IsSortedCore
        {
            get { return isSortedValue; }
        }
        protected override void RemoveSortCore()
        {
            isSortedValue = false;
            sortPropertyValue = null;
        }
        protected override void OnListChanged(ListChangedEventArgs e)
        {
            if (!sorting && sortPropertyValue != null)
                ApplySortCore(sortPropertyValue, sortDirectionValue);
            else
                base.OnListChanged(e);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80

    可以用更简单的方法:
    使用BindingList.Insert() 插入到对应的index值排序下。

  • 相关阅读:
    el-date-picker 组件 监听输入的内容 并按照时间格式 格式化
    EasyNLP中文文图生成模型带你秒变艺术家
    跑出了几个明星厂商,DaaS赛道要火?
    Java HashSet集合概述
    数据分析笔记1
    [机器视觉]halcon应用实例 边缘检测2
    融资约束指数:SA、KZ、WW (1999至2020年)
    Java学习笔记:SQLite数据库
    【深度学习框架-Paddle】ExternalError: CUDNN error(4), CUDNN_STATUS_INTERNAL_ERROR.报错原因
    【PCB专题】如何在嘉立创8月1日起的新规则下免费打样
  • 原文地址:https://blog.csdn.net/weixin_40029679/article/details/126408932