2011-02-26 2 views
7

Je développe actuellement une application C#.Enums et Combo Boxes en C#

Je dois utiliser une énumération avec une liste déroulante pour obtenir le mois sélectionné. Je les éléments suivants pour créer l'ENUM:

enum Months 
{ 
    January = 1, 
    February, 
    March, 
    April, 
    May, 
    June, 
    July, 
    August, 
    September, 
    October, 
    November, 
    December 
}; 

J'INITIALISER alors le combobox en utilisant:

cboMonthFrom.Items.AddRange(Enum.GetNames(typeof(Months))); 

Ce morceau de code fonctionne très bien mais le problème est lorsque je tente d'obtenir le ENUM sélectionné valeur pour le mois sélectionné

pour obtenir la valeur du recenseur de la zone de liste déroulante, je l'ai utilisé comme suit:

private void cboMonthFrom_SelectedIndexChanged(object sender, EventArgs) 
{ 
    Months selectedMonth = (Months)cboMonthFrom.SelectedItem; 
    Console.WriteLine("Selected Month: " + (int)selectedMonth); 
} 

Toutefois, lorsque j'essaie d'exécuter le code ci-dessus, une erreur est survenue indiquant qu'une exception de première chance de type System.InvalidCastException s'est produite.

Ce que j'ai mal fait.

Merci pour toute aide que vous pouvez fournir

Répondre

7

Essayez cette

Months selectedMonth = (Months)Enum.Parse(typeof(Months), cboMonthFrom.SelectedItem.ToString()); 

au lieu de

Months selectedMonth = (Months)cboMonthFrom.SelectedItem; 

Mise à jour avec les changements corrects

+0

excellent qui a parfaitement fonctionné. Merci – Boardy

+0

Il n'est pas nécessaire d'insérer des chaînes dans la liste déroulante, puis de les analyser de nouveau en valeurs 'Mois'. Il suffit de stocker les valeurs 'Months'. – Timwi

+0

Vous n'êtes pas censé stocker des valeurs de chaîne dans une zone de liste déroulante et les récupérer en tant qu'énumérations. Vous devez soit ajouter des valeurs enum en tant qu'élément de zone de liste déroulante, soit les obtenir en tant que chaîne et convertir en énumération. C'est pourquoi j'ai suggéré de faire le dernier. – SadullahCeran

6

Le problème est que vous peuplant combobox avec des noms de chaînes (Enum.GetNames renvoie string[]) et plus tard vous essayez de le jeter à votre énumération. Une solution possible pourrait être:

Months selectedMonth = (Months)Enum.Parse(typeof(Months), cboMonthFrom.SelectedItem); 

Je voudrais également envisager d'utiliser des informations existantes mois de .Net au lieu d'ajouter votre ENUM:

var formatInfo = new System.Globalization.DateTimeFormatInfo(); 

var months = Enumerable.Range(1, 12).Select(n => formatInfo.MonthNames[n]); 
1

Vous avez enregistré les noms des mois dans la zone de liste déroulante, pas les valeurs int. Votre élément sélectionné sera une chaîne.

5

Essayez

Months selectedMonth = 
    (Months) Enum.Parse(typeof(Months), cboMonthFrom.SelectedItem); 
3

Il n'y a vraiment aucune raison d'utiliser Enum.GetNames du tout. Pourquoi stocker des chaînes dans le ComboBox si vous voulez réellement les mois?

utiliser juste Enum.GetValues à la place:

foreach (var month in Enum.GetValues(typeof(Months))) 
    cboMonthFrom.Items.Add(month); 

[...] 

// This works now 
Months selectedMonth = (Months)cboMonthFrom.SelectedItem; 
+0

+ 1 pour mettre les valeurs réelles dans la liste déroulante, mais j'utiliserais 'AddRange' – Snowbear

+1

@Snowbear: Déjà essayé ... Le plus court chemin à faire est' combo.Items.AddRange (Enum.GetValues ​​(typeof (Months)) .Cast () .ToArray()) ', ce que je pensais être inutilement rond-point. – Timwi

+1

Oh, je pensais que ça marcherait sans 'ToArray()'. Hate ces méthodes ayant l'argument 'Array' où' IEnumerable' devrait être suffisant. – Snowbear