Mucha gente ha respondido a la pregunta de cómo vincular una enumeración a un cuadro combinado en WinForms. Es como esto:
comboBox1.DataSource = Enum.GetValues(typeof(MyEnum));
Pero eso es bastante inútil sin poder establecer el valor real para mostrar.
Yo he tratado:
comboBox1.SelectedItem = MyEnum.Something; // Does not work. SelectedItem remains null
También he intentado:
comboBox1.SelectedIndex = Convert.ToInt32(MyEnum.Something); // ArgumentOutOfRangeException, SelectedIndex remains -1
¿Alguien tiene alguna idea de cómo hacer esto?
SelectedValue
causa unaInvalidOperationException
. "No se puede establecer elSelectedValue
en unListControl
con un vacíoValueMember
".Respuestas:
La enumeración
Establecer los valores desplegables de él
Obtener la enumeración del elemento seleccionado
fuente
Simplificar:
Primero inicialice este comando: (por ejemplo, después
InitalizeComponent()
)Para recuperar el elemento seleccionado en el cuadro combinado:
Si desea establecer el valor para el cuadro combinado:
fuente
El código
está bien, el problema debe residir en el enlace de datos. Las asignaciones de DataBinding ocurren después del constructor, principalmente la primera vez que se muestra el cuadro combinado. Intente establecer el valor en el evento Load. Por ejemplo, agregue este código:
Y verifica si funciona.
fuente
Tratar:
EDICIONES:
Vaya, ya lo has intentado. Sin embargo, funcionó para mí cuando mi comboBox se configuró como DropDownList.
Aquí está mi código completo que funciona para mí (con DropDown y DropDownList):
fuente
Digamos que tienes la siguiente enumeración
Debe tener una estructura para asignar esos valores a una cadena:
Ahora devuelva una matriz de objetos con todas las enumeraciones asignadas a una cadena:
Y use lo siguiente para completar su cuadro combinado:
Cree una función para recuperar el tipo de enumeración en caso de que desee pasarlo a una función
y entonces deberías estar bien :)
fuente
Tuple
en su lugar). Convertiría tanto el valor de enumeración como la descripción en propiedades, luego agregaría anumberCB.DisplayProperty = "Caption"
; `ynumberCB.ValueProperty = "Num"
para que pueda usarloSelectedValue
directamente y vincularlo.Prueba esto:
StoreObject es mi ejemplo de objeto con la propiedad StoreObjectMyEnumField para almacenar el valor MyEnum.
fuente
fuente
Esta es la solución para cargar el elemento de enumeración en el cuadro combinado:
Y luego use el elemento enum como texto:
fuente
Basado en la respuesta de @Amir Shenouda termino con esto:
Definición de Enum:
Establecer los valores desplegables a partir de él:
Obtener la enumeración del elemento seleccionado:
fuente
fuente
Fuente completa ... Enlace de una enumeración a Combobox
fuente
Utilizo el siguiente método auxiliar, que puedes vincular a tu lista.
fuente
Convierta la enumeración en una lista de cadenas y agréguela al cuadro combinado
Establezca el valor mostrado usando selectedItem
fuente
Ninguno de estos funcionó para mí, pero esto funcionó (y tenía el beneficio adicional de poder tener una mejor descripción para el nombre de cada enumeración). No estoy seguro de si se debe a las actualizaciones de .net o no, pero creo que esta es la mejor manera. Deberá agregar una referencia a:
utilizando System.ComponentModel;
Luego, cuando desee acceder a los datos, use estas dos líneas:
fuente
Probablemente esto nunca se verá entre todas las otras respuestas, pero este es el código que se me ocurrió, tiene el beneficio de usar el
DescriptionAttribute
si existe, pero de lo contrario usar el nombre del valor enum.Usé un diccionario porque tiene un patrón de elemento clave / valor listo. UNA
List<KeyValuePair<string,object>>
también funcionaría y sin el hashing innecesario, pero un diccionario crea un código más limpio.Obtengo miembros que tienen un
MemberType
deField
y que son literales. Esto crea una secuencia de solo miembros que son valores de enumeración. Esto es robusto ya que una enumeración no puede tener otros campos.fuente
debería funcionar bien ... ¿Cómo puedes saber que
SelectedItem
es nulo?fuente
Puede usar las funciones "FindString ..":
fuente
Puede usar una lista de valores KeyValuePair como fuente de datos para el cuadro combinado. Necesitará un método auxiliar donde puede especificar el tipo de enumeración y devuelve IEnumerable> donde int es el valor de enum y string es el nombre del valor de enumeración. En su cuadro combinado, establezca la propiedad DisplayMember en 'Key' y la propiedad ValueMember en 'Value'. Value y Key son propiedades públicas de la estructura KeyValuePair. Luego, cuando establece la propiedad SelectedItem en un valor de enumeración como lo está haciendo, debería funcionar.
fuente
En el momento en que estoy usando la propiedad Items en lugar de DataSource, significa que tengo que llamar a Add para cada valor de enumeración, pero es una enumeración pequeña y su código temporal de todos modos.
Entonces puedo hacer Convert.ToInt32 en el valor y configurarlo con SelectedIndex.
Solución temporal, pero YAGNI por ahora.
Felicidades por las ideas, probablemente las usaré cuando haga la versión adecuada después de recibir una ronda de comentarios de los clientes.
fuente
Tal vez la pregunta anterior aquí, pero tuve el problema y la solución fue fácil y simple, encontré este http://www.c-sharpcorner.com/UploadFile/mahesh/1220/
Hace uso de la combinación de datos y funciona muy bien, así que échale un vistazo.
fuente
Ambos de estos trabajos para mí ¿estás seguro de que no hay nada más malo?
fuente
enum MyEnum { Something = 47 }
Método genérico para establecer una enumeración como fuente de datos para menús desplegables
La pantalla sería el nombre. El valor seleccionado sería Enum mismo
fuente
Eso siempre fue un problema. si tiene una enumeración ordenada, como de 0 a ...
puede vincular nombres al cuadro combinado y en lugar de usar el
.SelectedValue
uso de propiedades.SelectedIndex
y el
fuente
En Framework 4 puede usar el siguiente código:
Para vincular MultiColumnMode enum a combobox, por ejemplo:
y para obtener el índice seleccionado:
nota: utilizo el cuadro combinado DevExpress en este ejemplo, puede hacer lo mismo en el cuadro combinado Win Form
fuente
Un poco tarde para esta fiesta,
El método SelectedValue.ToString () debería extraer DisplayedName. Sin embargo, este artículo DataBinding Enum y también con descripciones muestra una manera práctica no solo de tener eso, sino que también puede agregar un atributo de descripción personalizado a la enumeración y usarlo para el valor mostrado si lo prefiere. Muy simple y fácil y aproximadamente 15 líneas de código (a menos que cuentes las llaves) para todo.
Es un código bastante ingenioso y puede convertirlo en un método de extensión para arrancar ...
fuente
solo usa el casting de esta manera:
fuente
Puedes usar un método de extensión
Cómo usar ... Declarar enumeración
Este método muestra la descripción en los elementos del cuadro combinado
fuente
Esto funcionó para mí:
fuente