2011-03-18 8 views
10

Salut, puis-je savoir comment obtenir la valeur enum ci-dessous pour lier dans la liste déroulante? J'ai écrit le code ci-dessous qui fonctionne bien mais je me demande si c'est le meilleur moyen.Ajouter une énumération à la liste déroulante

public enum CourseStudentStatus 
{ 
    Active = 1, 
    Completed = 2, 
    TempStopped = 3, 
    Stopped = 4, 
} 

//Bind Course Status 
Dictionary<string, int> list = new Dictionary<string, int>(); 
foreach (int enumValue in Enum.GetValues(typeof(CourseStudentStatus))) 
    list.Add(Enum.GetName(typeof(CourseStudentStatus), enumValue), enumValue); 
var column = ((DataGridViewComboBoxColumn)dgv.Columns["studentCourseStatus"]); 
column.DataPropertyName = "StudentStatus";    
column.DisplayMember = "Key"; 
column.ValueMember = "Value"; 
column.DataSource= list.ToList(); 

----------------- ------------------- MISE À JOUR
Salut i J'ai changé mon code à cela selon Sanjeevakumar Hiremat et ça fonctionne parfaitement.

cbStatus.DataSource = Enum.GetValues(typeof(CourseStudentStatus));

Cependant, quand je veux un Get() et que vous souhaitez lier la valeur à la cbStatus, il jeta l'erreur { « objet de référence non définie à une instance d'un objet. »}
cbStatus.SelectedValue = Course.Status;.

Le cbStatus.Datasource n'est pas vide et il a valeur après lié à cbStatus.DataSource = Enum.GetValues(typeof(CourseStudentStatus));

conseils s'il vous plaît.

+0

Je pense qu'il est possible de réduire ce problème de code? ou pourrait-il être converti en une fonction? – VeecoTech

+0

vous pourriez mettre votre conversion à un dictionnaire dans une méthode d'extension pour System.Enum, ce qui rendrait votre code plus lisible et général, mais je ne pense pas qu'il existe un moyen de se lier à une énumération sans faire tous les GetValues ​​et GetName des trucs. –

Répondre

4

Je ne pense pas qu'il y ait un meilleur moyen. J'avais l'habitude de faire quelque chose de similaire avec une classe GenericListItem<T> où T est la valeur de support, dans votre cas, une énumération.

Cette classe a exposé Display chaîne et Value propriétés T à lier. Je pense que je remplaçais également ToString parce que c'est la valeur par défaut si vous ne spécifiez pas le DisplayMember. Je suis allé plus loin et fait un constructeur prenant juste Value et par défaut Display à Value.ToString, qui, dans le cas des travaux enums je pense.

je puis faire une List<GenericListItem<T>>, alimentation qui dans la DataSource de la colonne et définissez les propriétés en conséquence DisplayMember et ValueMember dans le code. Cette liste est l'alternative au dictionnaire utilisé dans votre exemple. Mais je ne dis pas que c'est une meilleure solution :-) Cependant, cela signifie que vous pouvez supprimer le code, disons enum itération, dans cette classe ou spécialiser la classe pour mieux gérer certains types de données, le tout dans le but d'être inséré dans une liste et lié à un contrôle.

+0

Pouvez-vous indiquer à quoi vous définissez DisplayMember et ValueMember? –

+1

@kirsteng La propriété 'Display' était la propriété' DisplayMember' et la propriété 'Value' était' ValueMember'.Ma classe était générique, donc vous deviez aussi fournir un moyen d'obtenir la représentation sous forme de chaîne de n'importe quelle valeur. Vous pouvez le faire en utilisant un 'Func ' ou quelque chose. –

17

La méthode suivante devrait être la plus simple pour le lier.

column.DataSource = Enum.GetValues(typeof(CourseStudentStatus)); 

Pour obtenir la valeur sélectionnée, vous devez la convertir en type enum.

CourseStudentStatus selectedValue = (CourseStudentStatus)column.SelectedValue 

Enum.GetValues retourne un tableau des valeurs de EnumType qui peut alors être lié à une quelconque commande.

J'ai testé cela sur une liste déroulante autonome, pas dans une colonne de liste déroulante dans DataGridView, YMMV.

+0

Devrait être bien dans un DataGridView - les mêmes propriétés sont exposées pour la liaison. –

+0

@Sanjeevakumar Hiremath: comment puis-je revenir à la combobox après Get(). cbRole.SelectedValue = user.RoleId; // après Get() – VeecoTech

+0

quel est le displaymember et valuemember que je devrais définir? – VeecoTech

Questions connexes