2015. 4. 27. 16:29
C# with DataGridView
프로그램 설명
DataGridView 칼럼을 sorting 하는 예제입니다.
SortableBindingList class 를 이용하며 BindingList class 에서 상속받은 것이며, PropertyComparer class 는 IComparer class 를 상속하여 구현하였습니다.
실행 후
1. 정렬을 하지 않은 경우
2. 정렬을 한 경우
프로그램 작성 순서
1. 라이브러리 클래스
SortableBindingList.cs
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
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. 사용하는 방법
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 |