Quelle est la meilleure façon de trier une zone de liste déroulante liée aux données ?

StackOverflow https://stackoverflow.com/questions/29731

  •  09-06-2019
  •  | 
  •  

Question

J'ai fait quelques recherches à ce sujet et il semble que la seule façon de trier une zone de liste déroulante liée aux données est de trier la source de données elle-même (un DataTable dans un DataSet dans ce cas).

Si tel est le cas, la question devient quelle est la meilleure façon de trier un DataTable ?

Les liaisons de la zone de liste déroulante sont définies dans l'initialisation du concepteur à l'aide de

myCombo.DataSource = this.typedDataSet;
myCombo.DataMember = "Table1";
myCombo.DisplayMember = "ColumnB";
myCombo.ValueMember = "ColumnA";

J'ai essayé de régler

this.typedDataSet.Table1.DefaultView.Sort = "ColumnB DESC";
Mais cela ne fait aucune différence, j'ai essayé de définir cela dans le constructeur de contrôle, avant et après un appel typedDataSet.Merge.

Était-ce utile?

La solution

Si vous utilisez un DataTable, vous pouvez utiliser le (DataTable.DefaultView) DataView.Sort propriété.Pour une plus grande flexibilité, vous pouvez utiliser le Source de liaison composant.BindingSource sera la DataSource de votre combobox.Ensuite, vous pouvez modifier votre source de données d'un DataTable à une liste sans modifier la DataSource de la liste déroulante.

Le composant Bindingsource sert à plusieurs fins.Tout d'abord, il simplifie les contrôles de liaison sur un formulaire aux données en fournissant une gestion des devises, des modifications de modification et d'autres services entre les contrôles de formulaires Windows et les sources de données.

Autres conseils

Vous pouvez réellement trier les vue par défaut sur un DataTable :

myDataTable.DefaultView.Sort = "Field1, Field2 DESC";

Cela triera toutes les lignes que vous récupérez directement à partir du DataTable.

Assurez-vous de lier DefaultView à la source de données Controls, après avoir défini la propriété Sort, et non la table :

myCombo.DataSource = this.typedDataSet.Tables["Table1"].DefaultView;
myCombo.DisplayMember = "ColumnB";
myCombo.ValueMember = "ColumnA";

Josh Smith a un article de blog cela répond à cette question et fait tout cela en XAML.

Les données doivent-elles être dans un DataTable ?Utiliser une SortedList et la lier à une zone de liste déroulante serait un moyen plus simple.

Si vous devez utiliser un DataTable, vous pouvez utiliser la méthode Select pour récupérer un DataView et transmettre un paramètre de tri.

DataView dv = myDataTable.Select("filter expression", "sort");

La manière la plus simple de trier une ComboBox est d'utiliser le ComboBox.Trié propriété.Cependant, cela ne fonctionnera pas si vous utilisez la liaison de données.Dans ce cas, vous devrez trier la source de données elle-même.

Vous pouvez utiliser soit un Liste triée ou Dictionnaire trié (tous deux triés par clé), ou un Vue de données.

Le DataView a un Trier propriété qui accepte une expression de tri (chaîne) par exemple :

view.Sort = "State, ZipCode DESC";

Dans l'exemple ci-dessus, State et ZipCode sont des colonnes du DataTable utilisées pour créer le DataView.

Je me rends compte que vous avez déjà choisi votre réponse à cette question, mais j'aurais suggéré de placer un DataView sur votre formulaire, de le lier à votre DataSet/DataTable et de définir le tri sur la vue dans le concepteur.Vous liez ensuite votre combobox au DataView, plutôt qu'au DataSet/DataTable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top