2011-03-18 26 views
10

Hola, ¿puedo saber cómo obtener el valor enumerado a continuación para vincularlo al cuadro combinado? Escribí el siguiente código que funciona bien pero me pregunto si es la mejor manera.Agregar enum al cuadro combinado

public enum CourseStudentStatus 
{ 
    Active = 1, 
    Completed = 2, 
    TempStopped = 3, 
    Stopped = 4, 
} 

//Bind Course Status 
Dictionary<string, int> list = new Dictionary<string, int>(); 
foreach (int enumValue in Enum.GetValues(typeof(CourseStudentStatus))) 
    list.Add(Enum.GetName(typeof(CourseStudentStatus), enumValue), enumValue); 
var column = ((DataGridViewComboBoxColumn)dgv.Columns["studentCourseStatus"]); 
column.DataPropertyName = "StudentStatus";    
column.DisplayMember = "Key"; 
column.ValueMember = "Value"; 
column.DataSource= list.ToList(); 

----------------- ACTUALIZACIÓN -------------------
Hola i he cambiado mi código a esto de acuerdo con Sanjeevakumar Hiremat y funciona perfectamente.

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

Sin embargo, cuando quiero un get() y desea enlazar el valor de nuevo a la cbStatus, echó error { "Referencia a objeto no establecida como instancia de un objeto."}
cbStatus.SelectedValue = Course.Status;.

El cbStatus.Datasource no está vacío y no tiene valor después ligado a cbStatus.DataSource = Enum.GetValues(typeof(CourseStudentStatus));

consejo por favor.

+0

estoy pensando ¿es posible reducir esta basura de código? o podría ser convertido a una función? – VeecoTech

+0

podría convertir su conversión a un diccionario en un método de extensión para System.Enum, lo que haría que su código sea más legible y general, pero no creo que haya una forma de vincularse a una enumeración sin hacer todos los GetValues ​​y GetName cosas. –

Respuesta

4

No creo que haya una mejor manera. Solía ​​hacer algo similar con una clase GenericListItem<T> donde T es el valor de respaldo, en su caso, una enumeración.

Esta clase expuso Display cadena y Value T propiedades para enlazar. Creo que también estaba anulando ToString porque es el valor predeterminado si no especifica el DisplayMember. Fui más lejos e hice un constructor tomando solo Value y Display por defecto a Value.ToString, que en el caso de las enumeraciones funciona, creo.

Me continuación, hacer un List<GenericListItem<T>>, alimentación que en el DataSource de la columna y establecer el DisplayMember y ValueMember propiedades en consecuencia en el código. Esta lista es la alternativa al diccionario utilizado en su ejemplo.

Pero no digo que sea una mejor solución :-), sin embargo, significa que puede eliminar código, decir iteración enum, en esta clase o especializar la clase para manejar ciertos tipos de datos mejor, todo con el objetivo final de ser insertado en una lista y vinculado a un control.

+0

¿Puedes decir a qué configuras DisplayMember y ValueMember? –

+1

@kirsteng La propiedad 'Display' era' DisplayMember' y la propiedad 'Value' era' ValueMember'.Mi clase era genérica, por lo que también tenía que proporcionar una forma de obtener la representación de cadena de cualquier valor que tuviera. Puedes hacer eso usando un 'Func ' o algo así. –

17

Lo siguiente debe ser la forma más sencilla de vincularlo.

column.DataSource = Enum.GetValues(typeof(CourseStudentStatus)); 

Para obtener el valor seleccionado, debe convertirlo al tipo enum.

CourseStudentStatus selectedValue = (CourseStudentStatus)column.SelectedValue 

Enum.GetValues devuelve una matriz de los valores enumType que entonces se pueden unir a cualquier control.

He probado esto en un cuadro combinado independiente, no en una columna de cuadro combinado en DataGridView, YMMV.

+0

Debería estar bien en un DataGridView: las mismas propiedades están expuestas para el enlace. –

+0

@Sanjeevakumar Hiremath: cómo me vuelvo a vincular al cuadro combinado después de Get(). cbRole.SelectedValue = user.RoleId; // después de Get() – VeecoTech

+0

¿cuál es el displaymember y valuemember que debo establecer? – VeecoTech

Cuestiones relacionadas