Die Sortierung von benutzerdefinierten Spalten in einem DataGridView an eine BindingList
Ich habe eine DataGridView die Daten an eine BindingList. Mein DataGridView hat auch eine Reihe von benutzerdefinierten Spalten, die habe ich Hinzugefügt. Diese sind nicht Daten-gebunden, sondern werden generiert basierend auf Artikel in meinem BindingList (sprich: einen Eintrag in mein BindingList der Typ a hat Eine Eigenschaft vom Typ B; meine benutzerdefinierte Spalte B. Name (EDIT: In diesem Fall "Name" ist eine Eigenschaft der Klasse B, und damit das Eigentum der durch die Spalte dargestellt wird, nicht direkt gefunden, in der die Elemente in der BindingList)).
Ich muss in der Lage sein, zu Sortieren alle Spalten in mein DataGridView. DataGridView hat zwei Art-Methoden: Sort(IComparer), und Sort(DataGridViewColumn, ListSortDirection). Ich benutze die zweite für meine Daten Sortieren-gebundenen Spalten, aber natürlich löst eine Ausnahme aus, wenn auf einer nicht-Daten-gebundene Spalte. Die erste Methode eine Ausnahme werfen, wenn die DataSource ist nicht null.
Also weder von DataGridView built-in Art Methoden funktioniert soweit ich das sagen kann. Wie sonst kann ich Sortiere meine grid basiert auf meine benutzerdefinierte Spalten?
EDIT:
Was ich im moment tun ist, behandeln Sie das klicken auf die Kopfzeile der Spalte, nach der Anleitung hier gesehen: http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.columnheadermouseclick.aspx
Das problem entsteht bei der Zeile:
dataGridView1.Sort(newColumn, direction);
Dinge funktionieren toll, wenn newColumn besitzt eine der Eigenschaften eines Objekts in meinem BindingList. Aber um das zu Sortieren, eine meiner benutzerdefinierten Spalten, werde ich haben, um zu vermeiden, diese Linie zu verzichten und einen anderen Weg finden, um die Daten zu Sortieren grid basierend auf dieser Spalte. Heißt das, dass ich meine eigenen Funktion Sortieren? Das scheint, wie es sein kann, ein gigantischer Schmerz.
InformationsquelleAutor C Walker | 2011-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
ENDGÜLTIGE Bearbeitung/Antwort: ich kann nicht denken, ein Weg, dies zu tun, während immer noch die Sortier-Mechanismus integriert das DataGridView. Wenn ich in deinen Schuhen wäre, würde ich wahrscheinlich ändern Sie einfach die SortMode jeder Spalte auf "Programmatische" und dann mit der "ColumnHeaderMouseClick" selbst. An diesem Punkt sollten Sie rufen eine sort-Methode in Ihrer modifizierten BindingList-Klasse, die die Sortierung durchzuführen, wie dies nach dem, welche Spalte geklickt wurde. Dies vermeidet die Verwendung der Sort-Methode des DGV und die Art der zugrunde liegenden Liste direkt.
Vollständigen Diskurs, der Sich in den Kommentaren Abschnitt. Original-Antwort folgt sofort:
EDIT: Aufgrund einiger Verwirrung über das problem und die anschließende Diskussion darüber, ich habe einen neuen Vorschlag unten in den Kommentaren mit dieser Antwort. Ich bin dabei die ursprüngliche Antwort, die ich gepostet, damit wir auf ihn verweisen zu können.
Ich vor kurzem hatte, dies zu tun - und ich werde nicht Lügen, es war eine echte Schmerzen. Ich habe eine Lösung (mit Hilfe von einigen Freunden hier bei), SO hier geht. Ich habe eine neue IComparer-basierte Schnittstelle, können Sie angeben, sowohl eine Spalten-und eine Richtung. Ich habe das nur getan, weil ich brauche meine Sortierung code so allgemein wie möglich - ich habe ZWEI Netze, die Notwendigkeit, Art, wie dieser, und ich will nicht behaupten zweimal den code. Hier ist die Schnittstelle, ganz einfach:
Offensichtlich, wenn Sie nicht besorgt über die Dinge zu halten, die generische (sollte man wohl), als dies ist nicht unbedingt notwendig. Dann baute ich eine neue Klasse, basierend auf BindingList<>. Dies erlaubte mir, zu überschreiben Sortieren-code und meinen eigenen IByColumnComparer auf eine Spalte um Spalte basis das ist, was erlaubt die Flexibilität, die ich brauchte. Check this out:
Nun, wie Sie sehen können, in der ApplySortCore Methode, erhalte ich die Spalte und die Richtung direkt aus dem DataGridView - das heißt, ich fordere nicht das programmgesteuert. Das klingt nicht, was Sie tun möchten, aber Sie können leicht ändern Sie diesen code, wenn Sie anrufen möchten, müssen Sie programmgesteuert und übergeben Sie die entsprechende IByColumnComparer. Mein Punkt in der Ihnen zeigt all dies, damit Sie verstehen können, wie das ändern der Sortier-Algorithmus, die sehr nützlich ist.
Besonderen Dank an @MartinhoFernandes für die Anregungen dazu, dass wir in dieser Klasse mehr Generika.
Ok, ich muss nicht verstehen, diesen Satz korrekt: "das sind nicht Daten-gebunden, sondern werden generiert basierend auf Artikel in meinem BindingList (sprich: einen Eintrag in mein BindingList der Typ a hat Eine Eigenschaft vom Typ B; meine benutzerdefinierte Spalte B. Name)." Wenn die Spalte "generiert" basierend auf den Eigenschaften der Elemente, die in Ihrer BindingList, dann ist es wirklich Datenbindung, richtig? Kannst du nicht für den test Prop name in der ApplySortCore Methode?
Ah, ich glaube, ich kann sehen, die Mehrdeutigkeit. Habe ich das nicht gemeint "Name" in den Namen der Eigenschaft, sondern ist Name einer anderen Eigenschaft innerhalb der Klasse B. Damit die Daten in der benutzerdefinierten Spalte wird nicht vertreten von einer der Eigenschaften, die in der Klasse A. In jedem Fall nicht so weit wie ApplySortCore, die Ausnahme ausgelöst wird, vor.
Ok! Ich bin jetzt bei dir. So gibt es eine bindinglist gefüllt mit Objekt von Typ A, und eine der Eigenschaften von Typ A ist Typ B, und Sie wollen zu füllen (und Art) eine raster-Spalte, indem Sie eine Eigenschaft des Typs B Sind Sie in der Lage, füllen Sie es jetzt? Wenn ja, wie sind Sie zu erreichen?
Yep, genau das ist es. Jetzt fülle ich es über das CellFormatting-Ereignis: msdn.microsoft.com/en-us/library/... . Grundsätzlich ist der event-handler-zahlen, ob die "aktuelle" Zelle enthalten ist, in eine meiner benutzerdefinierten Spalten, dann ein Programm zahlen, was dem Wert in der Zelle.
InformationsquelleAutor Chris Barlow