Enlazando una enumeración a un cuadro combinado de WinForms, y luego configurándolo

Mucha gente ha respondido a la pregunta de cómo enlazar 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?

El Enum

 public enum Status { Active = 0, Canceled = 3 }; 

Estableciendo los valores desplegables desde él

 cbStatus.DataSource = Enum.GetValues(typeof(Status)); 

Obtener la enumeración del elemento seleccionado

 Status status; Enum.TryParse(cbStatus.SelectedValue.ToString(), out status); 

El código

 comboBox1.SelectedItem = MyEnum.Something; 

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. Intenta establecer el valor en el evento Load. Por ejemplo, agregue este código:

 protected override void OnLoad(EventArgs e) { base.OnLoad(e); comboBox1.SelectedItem = MyEnum.Something; } 

Y comprueba si funciona

Digamos que tienes la siguiente enumeración

 public enum Numbers {Zero = 0, One, Two}; 

Necesita tener una estructura para asignar esos valores a una cadena:

 public struct EntityName { public Numbers _num; public string _caption; public EntityName(Numbers type, string caption) { _num = type; _caption = caption; } public Numbers GetNumber() { return _num; } public override string ToString() { return _caption; } } 

Ahora devuelve una matriz de objetos con todas las enumeraciones asignadas a una cadena:

 public object[] GetNumberNameRange() { return new object[] { new EntityName(Number.Zero, "Zero is chosen"), new EntityName(Number.One, "One is chosen"), new EntityName(Number.Two, "Two is chosen") }; } 

Y use lo siguiente para completar su cuadro combinado:

 ComboBox numberCB = new ComboBox(); numberCB.Items.AddRange(GetNumberNameRange()); 

Crea una función para recuperar el tipo de enumeración en caso de que quieras pasarlo a una función

 public Numbers GetConversionType() { EntityName type = (EntityName)numberComboBox.SelectedItem; return type.GetNumber(); } 

y entonces deberías estar bien 🙂

Simplificar:

Primero inicialice este comando: (por ejemplo, después de InitalizeComponent() )

 yourComboBox.DataSource = Enum.GetValues(typeof(YourEnum)); 

Para recuperar el elemento seleccionado en el cuadro combinado:

 YourEnum enum = (YourEnum) yourComboBox.SelectedItem; 

Si desea establecer el valor para el cuadro combinado:

 yourComboBox.SelectedItem = YourEnem.Foo; 

Tratar:

 comboBox1.SelectedItem = MyEnum.Something; 

EDICIONES:

Vaya, ya lo has intentado. Sin embargo, funcionó para mí cuando mi comboBox estaba configurado para ser DropDownList.

Aquí está mi código completo que funciona para mí (con DropDown y DropDownList):

 public partial class Form1 : Form { public enum BlahEnum { Red, Green, Blue, Purple } public Form1() { InitializeComponent(); comboBox1.DataSource = Enum.GetValues(typeof(BlahEnum)); } private void button1_Click(object sender, EventArgs e) { comboBox1.SelectedItem = BlahEnum.Blue; } } 

Prueba esto:

 // fill list MyEnumDropDownList.DataSource = Enum.GetValues(typeof(MyEnum)); // binding MyEnumDropDownList.DataBindings.Add(new Binding("SelectedValue", StoreObject, "StoreObjectMyEnumField")); 

StoreObject es mi ejemplo de objeto con la propiedad StoreObjectMyEnumField para almacenar el valor MyEnum.

  public static void FillByEnumOrderByNumber(this System.Windows.Forms.ListControl ctrl, TEnum enum1, bool showValueInDisplay = true) where TEnum : struct { if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj"); var values = from TEnum enumValue in Enum.GetValues(typeof(TEnum)) select new KeyValuePair( (enumValue), enumValue.ToString()); ctrl.DataSource = values .OrderBy(x => x.Key) .ToList(); ctrl.DisplayMember = "Value"; ctrl.ValueMember = "Key"; ctrl.SelectedValue = enum1; } public static void FillByEnumOrderByName(this System.Windows.Forms.ListControl ctrl, TEnum enum1, bool showValueInDisplay = true ) where TEnum : struct { if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj"); var values = from TEnum enumValue in Enum.GetValues(typeof(TEnum)) select new KeyValuePair ( (enumValue), enumValue.ToString() ); ctrl.DataSource = values .OrderBy(x=>x.Value) .ToList(); ctrl.DisplayMember = "Value"; ctrl.ValueMember = "Key"; ctrl.SelectedValue = enum1; } 

En base a la respuesta de @Amir Shenouda termino con esto:

La definición de Enum:

 public enum Status { Active = 0, Canceled = 3 }; 

Establecer los valores desplegables desde allí:

 cbStatus.DataSource = Enum.GetValues(typeof(Status)); 

Obteniendo la enumeración del ítem seleccionado:

 Status? status = cbStatus.SelectedValue as Status?; 
 public Form1() { InitializeComponent(); comboBox.DataSource = EnumWithName.ParseEnum(); comboBox.DisplayMember = "Name"; } public class EnumWithName { public string Name { get; set; } public T Value { get; set; } public static EnumWithName[] ParseEnum() { List> list = new List>(); foreach (object o in Enum.GetValues(typeof(T))) { list.Add(new EnumWithName { Name = Enum.GetName(typeof(T), o).Replace('_', ' '), Value = (T)o }); } return list.ToArray(); } } public enum SearchType { Value_1, Value_2 } 

esta es la solución para cargar item de enum en combobox:

 comboBox1.Items.AddRange( Enum.GetNames(typeof(Border3DStyle))); 

Y luego usa el ítem enum como texto:

 toolStripStatusLabel1.BorderStyle = (Border3DStyle)Enum.Parse(typeof(Border3DStyle),comboBox1.Text); 
  public enum Colors { Red = 10, Blue = 20, Green = 30, Yellow = 40, } comboBox1.DataSource = Enum.GetValues(typeof(Colors)); 

Fuente completa … Enlazando una enumeración a Combobox

Utilizo el siguiente método de ayuda, que puedes vincular a tu lista.

  '''  ''' Returns enumeration as a sortable list. '''  ''' GetType(some enumeration) Public Shared Function GetEnumAsList(ByVal t As Type) As SortedList(Of String, Integer) If Not t.IsEnum Then Throw New ArgumentException("Type is not an enumeration.") End If Dim items As New SortedList(Of String, Integer) Dim enumValues As Integer() = [Enum].GetValues(t) Dim enumNames As String() = [Enum].GetNames(t) For i As Integer = 0 To enumValues.GetUpperBound(0) items.Add(enumNames(i), enumValues(i)) Next Return items End Function 

Convierta el enum a una lista de cadenas y agréguelo al comboBox

 comboBox1.DataSource = Enum.GetValues(typeof(SomeEnum)).Cast(); 

Establezca el valor mostrado usando selectedItem

 comboBox1.SelectedItem = SomeEnum.SomeValue; 
 comboBox1.SelectedItem = MyEnum.Something; 

debería funcionar bien … ¿Cómo puedes saber que SelectedItem es nulo?

Puede usar las funciones “FindString ..”:

 Public Class Form1 Public Enum Test pete jack fran bill End Enum Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ComboBox1.DataSource = [Enum].GetValues(GetType(Test)) ComboBox1.SelectedIndex = ComboBox1.FindStringExact("jack") ComboBox1.SelectedIndex = ComboBox1.FindStringExact(Test.jack.ToString()) ComboBox1.SelectedIndex = ComboBox1.FindStringExact([Enum].GetName(GetType(Test), Test.jack)) ComboBox1.SelectedItem = Test.bill End Sub End Class 

Puede usar una lista de valores de KeyValuePair como origen de datos para el cuadro combinado. Necesitará un método de ayuda 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 enum. En su cuadro combinado, establezca la propiedad DisplayMember en ‘Key’ y ValueMember en ‘Value’. El valor y la clave son propiedades públicas de la estructura KeyValuePair. Luego, cuando establezca la propiedad SelectedItem en un valor enum como lo está haciendo, debería funcionar.

En este momento estoy usando la propiedad Items en lugar de DataSource, significa que tengo que llamar a Add para cada valor enum, pero es una pequeña enumeración, y su código temporal de todos modos.

Entonces puedo hacer el Convert.ToInt32 en el valor y configurarlo con SelectedIndex.

Solución temporal, pero YAGNI por ahora.

Saludos por las ideas, probablemente las usaré cuando haga la versión correcta después de recibir una ronda de comentarios de los clientes.

Una vieja pregunta quizás aquí pero tuve el problema y la solución fue fácil y simple, encontré esto http://www.c-sharpcorner.com/UploadFile/mahesh/1220/

Hace uso de la unión de datos y funciona muy bien, así que échale un vistazo.

 comboBox1.DataSource = Enum.GetValues(typeof(MyEnum)); comboBox1.SelectedIndex = (int)MyEnum.Something; comboBox1.SelectedIndex = Convert.ToInt32(MyEnum.Something); 

Ambas cosas funcionan para mí ¿estás seguro de que no hay algo más?

Método genérico para establecer una enumeración como fuente de datos para drop-downs

La pantalla sería el nombre. El valor seleccionado sería Enum mismo

 public IList> GetDataSourceFromEnum() where T : struct,IConvertible { IList> list = new BindingList>(); foreach (string value in Enum.GetNames(typeof(T))) { list.Add(new KeyValuePair(value, (T)Enum.Parse(typeof(T), value))); } return list; } 

Eso siempre fue un problema. si tienes un Enum ordenado, como de 0 a …

 public enum Test one Two Three End 

puede enlazar nombres a combobox y en lugar de usar la propiedad .SelectedIndex use .SelectedIndex

  Combobox.DataSource = System.Enum.GetNames(GetType(test)) 

y el

 Dim x as byte = 0 Combobox.Selectedindex=x 

En Framework 4 puede usar el siguiente código:

Para enlazar MultiColumnMode enum al cuadro combinado, por ejemplo:

 cbMultiColumnMode.Properties.Items.AddRange(typeof(MultiColumnMode).GetEnumNames()); 

y para obtener el índice seleccionado:

 MultiColumnMode multiColMode = (MultiColumnMode)cbMultiColumnMode.SelectedIndex; 

nota: uso combobox DevExpress en este ejemplo, puede hacer lo mismo en Win Form Combobox

Un poco tarde para esta fiesta,

El método SelectedValue.ToString () debe extraer el DisplayedName. Sin embargo, este artículo DataBinding Enum y también With Descriptions muestra una forma práctica de no solo tenerlo, sino que puede agregar un atributo de descripción personalizado a la enumeración y usarlo para su valor visualizado si así lo prefiere. Muy simple y fácil y alrededor de 15 líneas más o menos de código (a menos que cuentes las llaves) para todo.

Es un código bastante ingenioso y puedes convertirlo en un método de extensión para iniciar …

solo use casting de esta manera:

 if((YouEnum)ComboBoxControl.SelectedItem == YouEnum.Español) { //TODO: type you code here }