2014-05-14 1 views
10

나는 IList < T>를 반환하고 DataGridView의 DataSource입니다. 나는 DataGridView가 IList를 정렬하지 않는다는 것을 배웠다. This stackoverflow Q&A을 읽고 SortableBindingList를 구현하려고합니다. 내 DataGridView가 비어 있기 때문에 뭔가 잘못하고 있어야합니다. 또한 TextBox를 사용하여 SortableBindingSource의 요소에 액세스하려고 시도했지만 아무 것도하지 않았습니다. DataGridView SortableBindingList 사용

using Microsoft.SqlServer.Management.Controls; 
public partial class Form1 : Form 
{ 
    IBusinessLayer businessLayer; 
    IList<Category> categories; 
    SortableBindingList<Category> catSortable; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

     businessLayer = new BusinessLayer(); 

     categories = businessLayer.GetAllCategories(); 
     catSortable = new SortableBindingList<Category>(categories); 
     categoryBindingSource.DataSource = catSortable; 
     categoryDataGridView.DataSource = categoryBindingSource; 

     textBox1.Text = catSortable[0].CategoryName; 

    } 
} 

나는이 잘 보이는 않는 Microsoft.SqlServer.Management.Controls을 검사?

namespace Microsoft.SqlServer.Management.Controls 
{ 
    public class SortableBindingList<T> : BindingList<T> 
    { 
     public SortableBindingList(); 
     public SortableBindingList(IList<T> list); 

     protected override bool IsSortedCore { get; } 
     protected override ListSortDirection SortDirectionCore { get; } 
     protected override PropertyDescriptor SortPropertyCore { get; } 
     protected override bool SupportsSortingCore { get; } 

     protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction); 
     protected override void RemoveSortCore(); 
    } 
} 

정말 도움을 주셔서 감사합니다. 모두에게 감사드립니다! 유래 예처럼 내 자신의 SortableBindingList 클래스를 생성하여 작업을

public class SortableBindingList<T> : BindingList<T> 
{ 
    private bool isSortedValue; 
    ListSortDirection sortDirectionValue; 
    PropertyDescriptor sortPropertyValue; 

    public SortableBindingList() 
    { 
    } 

    public SortableBindingList(IList<T> list) 
    { 
     foreach (object o in list) 
     { 
      this.Add((T)o); 
     } 
    } 

    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; 
      this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); 
     } 
     else 
     { 
      throw new NotSupportedException("Cannot sort by " + prop.Name + 
       ". This" + prop.PropertyType.ToString() + 
       " does not implement IComparable"); 
     } 
    } 

    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; } 
    } 
} 
+0

나는이있어 : – waltmagic

답변

16

이 SortableBindingList을보십시오. 그래도 Microsoft.SqlServer.Management.Controls.dll을 사용하고 싶었습니다. 거래는 뭐니?
+0

지금 사용하고있는 것과 매우 유사합니다. 너의 것이 "슬림"으로 보이고 NotSupportedException을 던졌습니다. 빠른 답변 감사합니다! C : \ Program Files \ Microsoft SQL Server \ 100 \ Setup Bootstrap \ Release \ x64의 Microsoft.SqlServer.Management.Controls.dll이 비어 있고 작동하지 않는 이유는 무엇입니까? – waltmagic

+1

@waltmagic 나는 그것이 어떻게 작동하는지 시험해보고 싶었습니다. 이제 Microsoft.SqlServer.Management.Controls.dll을 가져올 때 프로젝트 아키텍처와 프로세서 arhitecture의 호환성 문제로 인해 문제가 발생했습니다. 단순히 실행되지 않습니다. – msmolcic

+0

경고 메시지가 나타납니다. 32 비트 버전의 SQL Server를 설치하거나 내 서버 중 하나에서 Microsoft.SqlServer.Management.Controls.dll을 도용하여 차이가 있는지 확인합니다. 감사! – waltmagic