2011-02-26 17 views
7

Actualmente estoy desarrollando una aplicación C#.Enumerados y cuadros combinados en C#

Necesito usar una enumeración con un cuadro combinado para obtener el mes seleccionado. Tengo el siguiente para crear la enumeración:

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

entonces inicializar el cuadro combinado utilizando la siguiente:

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

Este bit de código funciona bien sin embargo el problema es cuando trato de conseguir la enumeración seleccionada valor para el mes seleccionado

para obtener el valor del empadronador en el cuadro combinado he utilizado el siguiente:

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

Sin embargo, cuando intento ejecutar el código anterior, aparece un error que indica que se produjo una excepción de primera oportunidad del tipo System.InvalidCastException.

Lo que he hecho mal.

Gracias por cualquier ayuda que puede proporcionar

Respuesta

7

probar este

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

en lugar de

Months selectedMonth = (Months)cboMonthFrom.SelectedItem; 

actualizada con los cambios correctos

+0

excelente que funcionó a la perfección. Gracias – Boardy

+0

No es necesario poner cadenas en el cuadro combinado y luego analizarlas en los valores de 'Meses '. Simplemente almacene los valores de 'Meses'. – Timwi

+0

No debe almacenar valores de cadena en el cuadro combinado y recuperarlos como enumeraciones. Debe agregar valores de enum como elemento del cuadro combinado O bien, agréguelos como cadenas y conviértelos en enumeración. Es por eso que sugerí hacer esto último. – SadullahCeran

6

La cuestión es que se está poblando cuadro combinado con nombres de cadena (Enum.GetNames devuelve string[]) y luego intentas convertirlo en tu enumeración. Una posible solución podría ser:

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

Me gustaría también considerar el uso de la información existente mes de .Net en lugar de añadir su enumeración:

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

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

Usted ha almacenado los nombres de los meses en el cuadro combinado, no los valores int. Su artículo seleccionado será una cadena.

5

Trate

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

Realmente no hay razón para usar Enum.GetNames en absoluto. ¿Por qué almacenar cadenas en el ComboBox si realmente quiere los meses?

sólo tiene que utilizar Enum.GetValues lugar:

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

[...] 

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

+1 para poner valores reales en el cuadro combinado, pero yo usaría 'AddRange' – Snowbear

+1

@Snowbear: Ya lo intenté ... La forma más rápida de hacerlo es' combo.Items.AddRange (Enum.GetValues ​​(typeof (Months)) .Cast () .ToArray()) ', que pensé que era innecesariamente indirecto. – Timwi

+1

Oh, pensé que funcionaría sin 'ToArray()'. Odio los métodos que tienen el argumento 'Array' donde' IEnumerable' debería ser suficiente. – Snowbear

Cuestiones relacionadas