2011-02-26 20 views
7

現在、C#アプリケーションを開発中です。C#の列挙型とコンボボックス

選択した月を取得するには、コンボボックスで列挙型を使用する必要があります。私は、列挙型を作成するには、次のいます

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

私は、次を使用してコンボボックスを初期化:

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

コードのこのビットは、しかし、正常に動作し、私が選択した列挙型を取得しようとすると問題があります選択した月

私は次のように使用しているコンボボックスから値を列挙子を取得するための値:

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

しかし、上記のコードを実行しようとすると、タイプSystem.InvalidCastExceptionのファーストチャンス例外が発生したというエラーが表示されます。

私は間違っています。あなたは正しい変更

答えて

7

この

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

の代わりにしてみてください提供することができます任意の助けのために

おかげで、あなたがコンボボックスを移入しているということです文字列名付き(Enum.GetNamesはを返します)、後で列挙型にキャストしようとします。一つの可能​​な解決策は次のようになります。

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

私もネットから既存の月の情報を使用しての代わりに、あなたの列挙型を追加することを検討します:

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

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

優れています。 – Boardy

+0

コンボボックスに文字列を入力してから、それらを解析して 'Months'値に戻す必要はありません。 'Months'値自体を保存するだけです。 – Timwi

+0

文字列値をコンボボックスに格納し、列挙として取得することは想定されていません。コンボボックスの項目としてenum値を追加するか、文字列として取得して列挙に変換する必要があります。それが私が後者をすることを提案した理由です。 – SadullahCeran

6

問題を更新しました

Months selectedMonth = (Months)cboMonthFrom.SelectedItem; 

1

あなたはコンボボックスでの月の名前を格納してきました、 int値ではありません。選択した項目は文字列になります。

5

は全くEnum.GetNamesを使用する理由は本当にありません

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

を試してみてください。実際に月が必要な場合、なぜComboBoxに文字列を格納するのですか?

だけではなく、Enum.GetValuesを使用します。完全に働いた

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

[...] 

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

+1は実際の値をコンボボックスに入れるのに+1ですが、私は 'AddRange'を使用します – Snowbear

+1

@Snowbear:既に試しました...これを行う最短の方法は' combo.Items.AddRange(Enum.GetValues(typeof(Months)) 。キャスト().ToArray()) '、私は不必要に迂回していると思いました。 – Timwi

+1

ああ、私はそれが 'ToArray()'なしでうまくいくと思った。 'IEnumerable'で十分なはずの' Array'引数を持つメソッドを嫌ってください。 – Snowbear