2010-08-18 10 views
3

Mon contrôle DataGridView trie actuellement en utilisant la propriété Sort des données liées, mais il ne fait pas ce que je veux faire.DataGridView Tri personnalisé dans WinForm

J'ai une colonne appelée Employee qui est affichée comme "Prénom Nom".

Lorsque je trier par Employee, Amy Z_Lastname est listé avant John A_Lastname, ce qui signifie que je préférerais trier par nom de famille.

Je pouvais briser la chaîne des employés en 3 parties, y compris ceux du DataTable, et définissez le type de « Nom, Prénom », puis cacher les colonnes Nom + Prénom. Apprenez à remplacer l'IComparer par défaut (ou tout ce qu'il utilise) pour fournir des instructions sur la manière de trier comme je le souhaite (la réponse que je préfère).

Répondre

3

Custom sorting in the DataGridView

DataGridView ne sait rien de ce classement , bien sûr. La valeur par défaut scénario de tri (tri automatique pour une colonne liée aux données) d'invoquer DataGridView.Sort() via un clic de souris d'en-tête de colonne simplement les délégués à la mise en œuvre IBindingList de ApplySort() dans la liste que vous avez lié à la grille. Normalement, cette liste serait un DataView. En utilisant ma mise en œuvre ObjectListView , ce serait une vue d'une liste d'objets métier arbitraires . De toute façon, vous finissez en comparant les propriétés des éléments de la liste en utilisant l'implémentation IComparable du type de propriété .

Détails

La propriété PropertyComparers expose un PropertyComparersCollection, qui est un dictionnaire de clés de nom de la propriété et les valeurs IComparer. Vous pouvez remplacer le IComparer une propriété à l'aide de la méthode PropertyComparersCollection.Add() ou l'indexeur (par exemple view.PropertyComparers [ "PropName"] = myComparer). Pour revenir au tri IComparable par défaut , utilisez la méthode PropertyComparersCollection.Remove() ou définissez la valeur IComparer sur null via l'indexeur.

Si un IComparer est ajouté à la collection de PropertyComparers, il être utilisé pour toutes sortes suivantes jusqu'à ce que il est retiré de la collection ou il est remplacé par un autre IComparer. Si la liste ObjectListView est déjà triée lorsqu'un IComparer est ajouté à ou supprimé de PropertyComparers, la vue est automatiquement triée de nouveau.

Si vous souhaitez modifier plusieurs comparateurs de propriété après la vue est triés, vous pouvez utiliser les méthodes ObjectListView BeginUpdate() et EndUpdate() pour supprimer la ListChanged et de tri événements jusqu'à ce que tous les IComparers ont été changé. Cela empêche plusieurs actualisations du DataGridView . Si l'ObjectListView n'est pas trié au moment où les IComparers sont ajoutés ou supprimés, aucun tri automatique n'est effectué.

Notez que lorsque le tri sur plusieurs colonnes , un IComparer personnalisé peut être utilisé avec une propriété de tri, et le genre IComparable par défaut sur un autre.

par exemple:

private void radioButtonSortProgram_CheckedChanged(object sender, EventArgs e) 

{ 

    if (this.radioButtonSortProgramAlpha.Checked) 

     this.view.PropertyComparers["Program"] = new CustomerProgramComparerAlpha(); 

    else if (this.radioButtonSortProgramRank.Checked) 

     this.view.PropertyComparers["Program"] = new CustomerProgramComparerRank(); 

    else 

     this.view.PropertyComparers.Remove("Program"); 

} 
+1

S'il vous plaît écrire un bref résumé de l'article, avec le code, en cas de pourriture de lien. On dirait que vous implémentez IComparable et que vous utilisez le mode virtuel ou que vous utilisez une implémentation de vue de liste personnalisée. –

+0

J'ai envoyé une question à l'auteur. Sa solution était d'utiliser ObjectListView, mais il ne le définit jamais. – jp2code

+0

+1 w/le résumé –