Tri Datagridview source de données sur Liste<T> où T est anonyme
Une question relativement simple. J'ai un datagridview, qui tous, il n'est affiche des statistiques. Il n'y a pas de modification/ajout/suppression de lignes. Le datagridview est lié à une Liste. Tout ce que je veux atteindre est pour les utilisateurs d'être en mesure de trier les colonnes.
class Market
{
public int Location {get;set;}
public float Value {get;set;}
//...
}
class City
{
public String Name {get;set;}
//...
}
List<Market> _markets;
List<City> _cities;
//Lists are populated.
dataGridView1.DataSource = _markets.Select(market =>
new { _cities[market.Location].Name, market.Value}).ToList();
Comme prévu, les colonnes ne sont pas sortable, mais l'information qui s'affiche est ce qui est voulu. Ma question est comment faire le DataGridView de tri basé sur le type de colonne avec le moins compliqué et moins de code, le code sera utilisé à plusieurs reprises tout au long de.
Cette application servant à utiliser une Base de données qui avait vues. Ces points de vue alors rempli le DataGridViews. Les vues sont toujours là, donc, une solution possible pourrait être:
DataBase.ViewMarketValue temp = new DataBase.ViewMarketValue()
_markets.ForEach(market => temp.AddViewMarketValueRow(_cities[market.Location].Name, market.Value);
dataGridView1.DataSource = temp;
Cette résultats dans la souhaitées: un datagridview qui a toutes les informations et c'est triable. Le seul problème est qu'il semble mal d'utiliser des points de vue sur cet aspect. Alors que dois-je faire?
OriginalL'auteur Nick Babcock | 2011-01-15
Vous devez vous connecter pour publier un commentaire.
Afin d'être en mesure de trier automatiquement les données dans le
DataGridView
, vous avez besoin d'une collection qui met en œuvreIBindingListView
. Dans la BCL, les seules classes qui implémentent cette interface sontDataView
etBindingSource
(mais cette dernière ne prend en charge le tri si le sous-jacent de la source de données prend en charge trop).Donc, vous avez plusieurs options:
DataTable
pour contenir les données, et le lier à laDataGridView
(il va se lier à laDefaultView
de laDataTable
)IBindingListView
d'utiliser une mise en œuvre, comme le
AdvancedList<T>
classe posté par Marc Gravel dans ce post. Vous devrez également ajouter un constructeur pour construire la liste de la suite de votre requête:Depuis le résultat de votre requête est un type anonyme, vous ne serez pas en mesure d'appeler le constructeur directement. La façon la plus simple de contourner le problème est de profiter de l'inférence de type, par la création d'une méthode générique qui permettra de créer la liste. Pour plus de commodité, vous pouvez créer une méthode d'extension:
Vous pouvez alors l'utiliser comme ça:
C'est lent, car il utilise la réflexion pour obtenir la valeur de la propriété. Vous pouvez facilement modifier le PropertyComparer classe de façon à ce qu'il génère un délégué au moment de sa création, et utilise cette délégué au lieu de la propriété.GetValue
il serait génial si vous pouviez poster quelques extrait de code pour mettre en œuvre votre suggestion. Merci
Mise en œuvre de la AdvancedList<T> de Marc Gravel. J'ai été mise à jour une application existante modification de la liaison de données de la vieille école de tables de données à des classes désérialisé à partir de sql jeux de résultats et c'est résout la perte de tri lors de la commutation de données sourcses à partir de tables de données à ILIST<T> de classes.
OriginalL'auteur Thomas Levesque
C'est ce que j'ai fait sur la base de Thomas Levesque (https://stackoverflow.com/a/4702631/1720085) et Marie Hamlin (https://stackoverflow.com/a/5805044/1720085) réponses:
1) Ajout d'une extension de la méthode de ma classe statique appelé
Funcs
2) Et de l'utiliser comme:
OriginalL'auteur Daniel Bonetti