2008-12-02 8 views
0

J'ai une colonne DataGridView personnalisée qui utilise un contrôle intégré qui apparaît une fenêtre de recherche de la valeur de cette colonne. L'important est que la colonne de databound soit un ID numérique, mais les cellules de colonne personnalisées affichent une description textuelle.DataGridView tri personnalisé pas DataMember (Databound Grid)

Comment puis-je obtenir la colonne pour trier sur la description du texte plutôt que l'ID numérique?

Je ne vois pas un moyen de passer outre la colonne pour trier par FormattedValue au lieu de la valeur. Je pourrais m'assurer que la description apparaisse comme une colonne séparée dans ma table de données, mais je ne vois aucun moyen de dire "utiliser la colonne VALUE_ID comme DataMember mais la colonne VALUE_DESCRIPITON comme 'SortMember'"

Répondre

2

Vous pouvez utiliser une technique décrite dans l'article suivant Column Sort Modes

private bool ascending; 
private int sortColumn; 
private void dgv_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    List<SomeObject> list = (List<SomeObject>)someBindingSource.DataSource; 
    if (e.ColumnIndex != sortColumn) ascending = false; 

    int 1 = e.ColumnIndex; 
    if (i == DescriptionColumn.Index) 
     list.Sort(new Comparison<SomeObject>((x,y) => x.ID.CompareTo(y.ID))); 

    sortColumn = e.ColumnIndex; 
    ascending = !ascending; 
    if (!ascending) list.Reverse(): 

    someBindingSource.ResetBindings(false); 
    // you may also have to call dgv.Invalidate(); 
} 
+0

Une table de données ne semble pas pouvoir être convertie en liste <> – Clyde

+0

Bien que je puisse simplement définir le tri directement sur la source de liaison à ce moment-là, je vais devoir essayer cela. – Clyde

1

Qu'est-ce que vous utilisez comme la source de données? un DataTable? Le tri est généralement fourni par la liste elle-même, ce qui vous permet d'écrire une liste personnalisée avec votre propre comportement de tri. L'approche la plus simple (bien que non triviale) serait d'hériter de BindingList<T>, et de surcharger ApplySortCore, RemoveSortCore, SupportsSortingCore, IsSortedCore, SortPropertyCore et SortDirectionCore (ouf!). En particulier, le ApplySortCore devrait détecter le PropertyDescriptor spécifique, et effectuer la recherche sur mesure.

Je ne dis pas qu'il est trivial (bien au contraire) - mais il peut être fait dans les mécanismes standards contraignants.

Une autre idée pourrait être de faire l'identifiant quelque chose d'autre, ce n'est pas en réalité un int, mais est une classe/struct personnalisée. Il aurait besoin de mettre en œuvre IComparable/IComparable<T>, et avoir un ToString() qui affiche le texte désiré. Alors vous pourriez vraisemblablement (non testé) lier directement à cette colonne.

Cependant !!! Si vous n'êtes pas déjà familier avec System.ComponentModel, je suggère d'éviter cette complexité. Si le fait ci-dessus sens, alors tout va bien - sinon, je ne suis pas sûr que je tenterais pour votre premier coup dans ce domaine ...

+0

Certainement pas trivial! Mais il semble qu'il n'y ait pas de moyen plus rapide de le faire. – Clyde

Questions connexes