2011-02-26 12 views
7

में मैं वर्तमान में एक सी # आवेदन के विकास कर रहा हूँ।Enums और कॉम्बो बक्से सी #

मेरे द्वारा चुने गए महीने के पाने के लिए एक कॉम्बो बॉक्स के साथ एक enum का उपयोग करने की जरूरत है। मैं enum बनाने के लिए निम्नलिखित है:

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

मैं तो का उपयोग कर बता गया आरंभ निम्नलिखित:

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

कोड के इस बिट ठीक काम करता है लेकिन समस्या यह है कि जब मैं चयनित enum प्राप्त करने की कोशिश चयनित महीने

के लिए मूल्य मूल्य कॉम्बो बॉक्स मैं निम्नलिखित का इस्तेमाल किया है से प्रगणक पाने के लिए:

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

हालांकि, जब मैं ऊपर यह एक त्रुटि कह प्रकार का एक पहला मौका अपवाद System.InvalidCastException हुआ साथ आता है कोड को चलाने के लिए प्रयास करें।

मैंने क्या गलत किया है।

धन्यवाद किसी भी मदद के लिए उपलब्ध करा सकते हैं

उत्तर

7

Months selectedMonth = (Months)cboMonthFrom.SelectedItem; 

सही परिवर्तन

+0

बहुत बढ़िया है कि पूरी तरह से काम किया। धन्यवाद – Boardy

+0

कॉम्बो बॉक्स में स्ट्रिंग डालना आवश्यक नहीं है और फिर उन्हें 'महीने' मानों में वापस पार्स करना आवश्यक नहीं है। बस 'महीने' मानों को स्वयं संग्रहित करें। – Timwi

+0

आपको कॉम्बो बॉक्स में स्ट्रिंग मानों को स्टोर नहीं करना चाहिए और उन्हें गणना के रूप में पुनर्प्राप्त करना नहीं है। आप या तो कॉम्बो बॉक्स आइटम के रूप में enum मान जोड़ने या उन्हें स्ट्रिंग के रूप में मिलता है और गणना करने के लिए कन्वर्ट करना होगा। यही कारण है कि मैंने बाद वाले को करने का सुझाव दिया। – SadullahCeran

6

मुद्दे के साथ अपडेट किया गया इस

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

बजाय प्रयास करें है कि आप बता गया पॉप्युलेट कर रहे हैं स्ट्रिंग नाम के साथ (Enum.GetNames रिटर्न string[]) और बाद में आप इसे अपने enum पर डालने का प्रयास करें। एक संभव समाधान हो सकता है:

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

मैं भी बजाय नेट से मौजूदा महीने जानकारी का उपयोग कर अपने enum जोड़ने पर विचार होगा:

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

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

आप बता गया में महीनों के नाम संग्रहीत किया है, int मूल्य नहीं। आपका चयनित आइटम एक स्ट्रिंग होगा।

5

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

प्रयास करें वहाँ वास्तव में Enum.GetNames उपयोग करने के लिए कोई कारण नहीं है। यदि आप वास्तव में महीनों चाहते हैं तो कॉम्बोबॉक्स में तार क्यों स्टोर करें?

बस Enum.GetValues बजाय का उपयोग करें:

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

[...] 

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

+1 वास्तविक मान को combobox में डालने के लिए +1 है, लेकिन मैं 'AddRange' – Snowbear

+1

@Snowbear का उपयोग करूंगा: पहले से ही कोशिश की गई है ... ऐसा करने का सबसे छोटा तरीका' combo.Items.AddRange (Enum.GetValues ​​(typeof (Months) है ।कास्ट ()। टोएरे()) ', जिसे मैंने सोचा था अनावश्यक रूप से चौराहे था। – Timwi

+1

ओह, मैंने सोचा कि यह 'ToArray() 'के बिना काम करेगा। 'ऐरे' तर्क वाले उन तरीकों से नफरत करें जहां 'IENumerable' पर्याप्त होना चाहिए। – Snowbear

संबंधित मुद्दे