datagridview 点击列标题排序

开发winform中,平时经常用到数据列表,我们大多选用datagridview,但是此控件本身没有排序的功能。参阅网上资料。留下标记,以后备用。

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

即:this.datagridview.DataSource=this.bindingSrc;

this.bindingSrc.DataSource=this.Model;

这种形式就完成了,数据的显示过程。但是要实现点击datagridview实现排序的功能,需要实现对数据源排序的功能。具体代码如下:


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

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

public class SortableBindingList<T> : BindingList<T>

    {

        private bool isSortedCore = true;

        private ListSortDirection sortDirectionCore = ListSortDirection.Ascending;

        private PropertyDescriptor sortPropertyCore = null;

        private string defaultSortItem;

        public SortableBindingList() : base() { }

        public SortableBindingList(IList<T> list) : base(list) { }

        protected override bool SupportsSortingCore

        {

            get return true; }

        }

        protected override bool SupportsSearchingCore

        {

            get return true; }

        }

        protected override bool IsSortedCore

        {

            get return isSortedCore; }

        }

        protected override ListSortDirection SortDirectionCore

        {

            get return sortDirectionCore; }

        }

        protected override PropertyDescriptor SortPropertyCore

        {

            get return sortPropertyCore; }

        }

        protected override int FindCore(PropertyDescriptor prop, object key)

        {

            for (int i = 0; i < this.Count; i++)

            {

                if (Equals(prop.GetValue(this[i]), key)) return i;

            }

            return -1;

        }

        protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)

        {

            isSortedCore = true;

            sortPropertyCore = prop;

            sortDirectionCore = direction;

            Sort();

        }

        protected override void RemoveSortCore()

        {

            if (isSortedCore)

            {

                isSortedCore = false;

                sortPropertyCore = null;

                sortDirectionCore = ListSortDirection.Ascending;

                Sort();

            }

        }

        public string DefaultSortItem

        {

            get return defaultSortItem; }

            set

            {

                if (defaultSortItem != value)

                {

                    defaultSortItem = value;

                    Sort();

                }

            }

        }

        private void Sort()

        {

            List<T> list = (this.Items as List<T>);

            list.Sort(CompareCore);

            ResetBindings();

        }

        private int CompareCore(T o1, T o2)

        {

            int ret = 0;

            if (SortPropertyCore != null)

            {

                ret = CompareValue(SortPropertyCore.GetValue(o1), SortPropertyCore.GetValue(o2), SortPropertyCore.PropertyType);

            }

            if (ret == 0 && DefaultSortItem != null)

            {

                PropertyInfo property = typeof(T).GetProperty(DefaultSortItem, BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.IgnoreCase, nullnullnew Type[0], null);

                if (property != null)

                {

                    ret = CompareValue(property.GetValue(o1, null), property.GetValue(o2, null), property.PropertyType);

                }

            }

            if (SortDirectionCore == ListSortDirection.Descending) ret = -ret;

            return ret;

        }

        private static int CompareValue(object o1, object o2, Type type)

        {

            if (o1 == nullreturn o2 == null ? 0 : -1;

            else if (o2 == nullreturn 1;

            else if (type.IsPrimitive || type.IsEnum) return Convert.ToDouble(o1).CompareTo(Convert.ToDouble(o2));

            else if (type == typeof(DateTime)) return Convert.ToDateTime(o1).CompareTo(o2);

            else return String.Compare(o1.ToString().Trim(), o2.ToString().Trim());

        }

    }

实现此类后,就可以通过 this.bindingSrc.DataSource=new SortableBindingList<CnsDetailReport>(this.Model); 实现点击列标题排序的目的了。

原文地址:https://www.cnblogs.com/soundcode/p/9507506.html

时间: 2024-11-10 06:42:45

datagridview 点击列标题排序的相关文章

DataGridView点击列标题排序

Dim newColumn As DataGridViewColumn = DataGridView1.Columns(e.ColumnIndex) Dim direction As System.ComponentModel.ListSortDirection If DataGridView1.SortOrder = SortOrder.Ascending Then direction = System.ComponentModel.ListSortDirection.Descending E

easyUI中点击datagrid列标题排序

easyUI中点击datagrid的排序有两种,一种是本地的,一种是服务器的.本地的只能排序当前页,而服务器的可以对全部页进行排序.这里主要是分享下服务器排序. 1.为datagrid添加属性remoteSort:true 表示通过服务器请求来进行排序 2.对datagrid中你想要排序的列添加属性sortable:true 表示该列允许排序 3.这时候点击列标题就会自动向服务器发送带有sort和order两个参数的请求,此处的请求即调用动态绑定datagrid的查询方法 sort 表示排序字段

zk listbox 点击列标题实现排序功能

前台(test.zul): <?page title="测试" contentType="text/html;charset=UTF-8"?> <z:zk xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://www.zkoss.org/2005/zul" xsi:schemaLocation="http://ww

C++ 简单实现MFC ListControl 点击列头排序

说明: SetItemData可以为每一行绑定一个DWORD类型的变量.用GetItemData可以获得这个变量.举个例子,假设CListCtrl中你需要显示某个数据表中的记录,该表有个流水号主键ID,一般这个ID值本身没有什么意义,用户也不需要看,因此在CListCtrl的可见列中,你不需要显示.但往往做具体查询等操作时,你又需要用这个ID来完成.这时,用SetItemData将其绑定到每一行,将非常方便,用户操作哪一行,则用GetItemData可以得到对应记录的ID,直接用来做操作,很爽.

jquery easyui datagrid 如何第一次点击列标题时是降序排列

使用 fnOnBeforeLoad在发回到服务器查询之前,修改排序和对应的图标样式. 1.配置 data-options='onBeforeLoad:fnOnBeforeLoad'. 2.对应的函数: function fnOnBeforeLoad(a,b){             if(a.sort=="Date"){//设置Date字段 第一次排序为倒序              var order=(a.order=="asc"?"desc&quo

多个ec:table无法正常点击列进行排序,提示uncaught typeerror

如下图 解决此异常,只要在每个ec:table加上tableId就行,如tableId="table3",这样ec:table可以正确区分同名列,也不会报上面这种bug

用DataGridView实现Excel列的复杂筛选功能

有个项目,客户要求表格要像Excel那样具有根据列的复杂筛选功能,而且最好不要改变太多原先的使用习惯. 上网搜了一下,大部分的都是把整列绑定到一个combobox上,覆盖到列标题上,从而达到简单的筛选功能. 仔细研究了下Excel的复杂筛选,仅靠DataGridView的右键功能不太好完全实现,于是就想到用一个panel来当筛选面板. =================================================================== 新建一个项目,form1中

DataGridView使用技巧十三:点击列头实现升序和降序排序

DataGridView 列有三种排序模式.每一列的排序模式是通过该列的 SortMode 属性指定的,该属性可以设置为以下的 DataGridViewColumnSortMode 枚举值之一. DataGridViewColumnSortMode 值说明: Automatic 文本框列的默认排序模式.除非将列标头用于选择,否则单击列标头将自动按此列对 DataGridView 排序,并显示一个指示排序顺序的标志符号(向上的三角箭头:升序排序:向下的三角箭头:降序排序). NotSortable

DataGridView列标题(列标头)不能居中的解决方法

winform DataGridView列标题(列标头)不能完全居中的解决方法,一般列标题的居中我们都使用 DgvDemo.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; 这样就居中的了,但如果行单元格也居中时你仔细看会发现列标题并没有完全居中,而是略微往左边一点,如果你深得这无关大雅,就没必要往下看此文了,如果你想解决此问题请看解决方法 在DataGridview所在窗体的