2014-05-14 4 views
10

Ich habe eine Funktion, die eine IList < T> zurückgibt und die DataSource für ein DataGridView ist. Ich habe gelernt, dass DataGridView IList nicht sortieren wird. Ich lese This stackoverflow Q&A und versuche, SortableBindingList zu implementieren. Ich muss etwas falsch machen, weil meine DataGridView leer ist. Ich habe auch versucht, auf ein Element von der SortableBindingSource mit einer TextBox und nichts auch zuzugreifen.DataGridView Verwenden von 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; 

    } 
} 

Ich inspizierte die Microsoft.SqlServer.Management.Controls dieses Recht aus?

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(); 
    } 
} 

Ich schätze die Hilfe und hilft mir zu lernen. Danke allen!

+0

ich dies durch die Schaffung von meiner eigenen SortableBindingList Klasse wie im Beispiel Stackoverflow zu arbeiten hätte. Ich wollte jedoch die Microsoft.SqlServer.Management.Controls.dll verwenden. Was ist das Problem? – waltmagic

Antwort

16

Versuchen Sie, diese 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

Sehr ähnlich dem, den ich jetzt benutze. Dein scheint etwas "schlanker" und löst NotSupportedException aus. Danke für die schnelle Antwort! Warum ist die Microsoft.SqlServer.Management.Controls.dll aus C: \ Programme \ Microsoft SQL Server \ 100 \ Setup Bootstrap \ Release \ x64 leer und funktioniert nicht – waltmagic

+1

@waltmagic Ich wollte ausprobieren, wie es bei mir funktioniert, aber Jetzt habe ich Probleme mit Kompatibilitätsproblemen meiner Projektarchitektur und Prozessorarchitektur, wenn ich Microsoft.SqlServer.Management.Controls.dll importiere und es einfach nicht läuft :) – msmolcic

+0

Ich bekomme diese Warnung auch. Ich werde die 32-Bit-Version von SQL Server installieren oder die Microsoft.SqlServer.Management.Controls.dll von einem meiner Server stehlen und sehen, ob das einen Unterschied macht. Vielen Dank! – waltmagic