2011-02-26 13 views
7

Şu anda bir C# uygulaması geliştiriyorum.Enumlar ve Birleşik Kutularda C#

Seçili ayı elde etmek için açılan kutuyu içeren bir enum kullanmalıyım. Ben enum oluşturmak için aşağıdaki adres: Sonra kullanarak combobox initialize

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

aşağıdaki: Ben seçilen enum almaya çalıştıklarında Bu kod biraz çalışıyor

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

ancak sorundur seçilen aya

için değer değerini aşağıdaki kullanmış açılan kutusundan numaralandırıcıyı almak için:

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

Bununla birlikte, yukarıdaki kodu çalıştırmayı denediğimde, bir hatayla karşılaşıyorsunuz: System.InvalidCastException türünde bir ilk fırsat istisnası oluştu.

Neyi yanlış yaptım. Doğru değişikliklere

cevap

7

bu

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

yerine deneyin sağlayabilir herhangi bir yardım için

teşekkürler combobox doldurma konum olmasıdır dize isimleriyle (Enum.GetNames,döndürür) ve daha sonra bunu sizin numaranıza dökmeye çalışın. Olası bir çözüm olabilir:

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

Ben de senin enum .NET mevcut ay bilgilerini kullanarak yerine eklemeyi düşünün: Siz combobox ay isimlerini sakladığınız

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

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

Mükemmel. 'Months' değerlerine geri açılan kutunun içine dizeleri koymak ve sonra bunları ayrıştırmak için gerekli değildir – Boardy

+0

teşekkür ederiz. Sadece 'Months' değerlerini kendiniz saklayın. – Timwi

+0

Sen açılan kutunun dize değerlerini saklamak ve numaralandırma olarak almak için gerekiyordu. Sen açılan kutu öğesi olarak enum değerleri ekleyin VEYA dize olarak onları almak ve numaralandırma dönüştürmek ya sahiptir. Ben ikinci yapmak önerilmektedir nedeni budur. combobox içine gerçek değerleri koymak için – SadullahCeran

6

konu ile güncellendi

Months selectedMonth = (Months)cboMonthFrom.SelectedItem; 

1

, int değerleri değil. Seçtiğiniz öğe bir dizi olacaktır.

5

hiç Enum.GetNames kullanmak için hiçbir neden yoktur

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

deneyin. Aylar gerçekten istiyorsan, dizeleri ComboBox'ta saklarsın?

Onun yerine Enum.GetValues kullanın: mükemmel çalıştı o

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

[...] 

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

1, ama ben kullanmak istiyorsunuz 'AddRange' – Snowbear

+1

@Snowbear: Zaten denedim ... bunu en kısa yolu' dır combo.Items.AddRange (Enum.GetValues ​​(typeof (Ay)) .Gereksiz bir şekilde döner kavşak olduğunu düşündüğüm () .ToArray()) 'ı yayınlayın. – Timwi

+1

Oh, ToArray() 'olmadan çalışacağını düşündüm. IEnumerable'ın yeterli olması gereken Array' argümanına sahip olan bu metotlardan nefret et. – Snowbear

İlgili konular