2015. 4. 27. 16:29
C# with DataGridView
프로그램 설명
DataGridView 칼럼을 sorting 하는 예제입니다.
SortableBindingList class 를 이용하며 BindingList class 에서 상속받은 것이며, PropertyComparer class 는 IComparer class 를 상속하여 구현하였습니다.
실행 후
1. 정렬을 하지 않은 경우
2. 정렬을 한 경우
프로그램 작성 순서
1. 라이브러리 클래스
SortableBindingList.cs
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 | using System; using System.Collections.Generic; using System.ComponentModel; using Be.Timvw.Framework.Collections.Generic; namespace Be.Timvw.Framework.ComponentModel { public class SortableBindingList<t> : BindingList<t> { private readonly Dictionary<type, propertycomparer<t>> comparers; private bool isSorted; private ListSortDirection listSortDirection; private PropertyDescriptor propertyDescriptor; public SortableBindingList() : base ( new List<t>()) { this .comparers = new Dictionary<type, propertycomparer<t>>(); } public SortableBindingList(IEnumerable<t> enumeration) : base ( new List<t>(enumeration)) { this .comparers = new Dictionary<type, propertycomparer<t>>(); } protected override bool SupportsSortingCore { get { return true ; } } protected override bool IsSortedCore { get { return this .isSorted; } } protected override PropertyDescriptor SortPropertyCore { get { return this .propertyDescriptor; } } protected override ListSortDirection SortDirectionCore { get { return this .listSortDirection; } } protected override bool SupportsSearchingCore { get { return true ; } } protected override void ApplySortCore(PropertyDescriptor property, ListSortDirection direction) { List<t> itemsList = (List<t>) this .Items; Type propertyType = property.PropertyType; PropertyComparer<t> comparer; if (! this .comparers.TryGetValue(propertyType, out comparer)) { comparer = new PropertyComparer<t>(property, direction); this .comparers.Add(propertyType, comparer); } comparer.SetPropertyAndDirection(property, direction); itemsList.Sort(comparer); this .propertyDescriptor = property; this .listSortDirection = direction; this .isSorted = true ; this .OnListChanged( new ListChangedEventArgs(ListChangedType.Reset, -1)); } protected override void RemoveSortCore() { this .isSorted = false ; this .propertyDescriptor = base .SortPropertyCore; this .listSortDirection = base .SortDirectionCore; this .OnListChanged( new ListChangedEventArgs(ListChangedType.Reset, -1)); } protected override int FindCore(PropertyDescriptor property, object key) { int count = this .Count; for ( int i = 0; i < count; ++i) { T element = this [i]; if (property.GetValue(element).Equals(key)) { return i; } } return -1; } } } |
PropertyComparer.cs
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 | using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Reflection; namespace Be.Timvw.Framework.Collections.Generic { public class PropertyComparer<t> : IComparer<t> { private readonly IComparer comparer; private PropertyDescriptor propertyDescriptor; private int reverse; public PropertyComparer(PropertyDescriptor property, ListSortDirection direction) { this .propertyDescriptor = property; Type comparerForPropertyType = typeof (Comparer<>).MakeGenericType(property.PropertyType); this .comparer = (IComparer)comparerForPropertyType.InvokeMember( "Default" , BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.Public, null , null , null ); this .SetListSortDirection(direction); } #region IComparer<t> Members public int Compare(T x, T y) { return this .reverse * this .comparer.Compare( this .propertyDescriptor.GetValue(x), this .propertyDescriptor.GetValue(y)); } #endregion private void SetPropertyDescriptor(PropertyDescriptor descriptor) { this .propertyDescriptor = descriptor; } private void SetListSortDirection(ListSortDirection direction) { this .reverse = direction == ListSortDirection.Ascending ? 1 : -1; } public void SetPropertyAndDirection(PropertyDescriptor descriptor, ListSortDirection direction) { this .SetPropertyDescriptor(descriptor); this .SetListSortDirection(direction); } } } |
2. 사용하는 방법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | private void RebindGridForPageChange() { //Rebinding the Datagridview with data int datasourcestartIndex = (CurrentPage - 1) * PageRows; Templist = new List<contacts>(); for ( int i = datasourcestartIndex; i < datasourcestartIndex + PageRows; i++) { if (i >= Baselist.Count) break ; Templist.Add(Baselist[i]); } //Set List data to SortableBindingList SortableBindingList<contacts> plist = new SortableBindingList<contacts>(Templist); dataGridView1.DataSource = plist; dataGridView1.Refresh(); } |
소스 파일 :
'C# with DataGridView' 카테고리의 다른 글
페이지 나누기가 있는 DataGridView (0) | 2015.04.24 |
---|---|
데이타베이스 4칙 연산(select, insert, delete, update) (0) | 2015.04.22 |