2010-05-19 24 views
8

Estoy creando dinámicamente un cuadro combinado de la siguiente manera:C# Conjunto elemento combinado con SelectedValue

public Control GenerateList(Question question) 
{ 
    // Get a list with answer possibilities 
    List<QuestionAnswer> answers = question.GetAnswers(); 

    // Get a collection of given answers 
    Collection<QuestionnaireAnswer> givenAnswers = question.GetFilledAnswers(); 

    ComboBox cmb = new ComboBox(); 
    cmb.Name = "cmb"; 
    cmb.DataSource = answers; 
    cmb.DisplayMember = "Answer"; 
    cmb.ValueMember = "Id"; 

    // Check an answer is given to the question 
    if (givenAnswers != null && givenAnswers.Count > 0) 
    { 
     cmb.SelectedValue = givenAnswers[0].AnswerId; 

    } 

    cmb.DropDownStyle = ComboBoxStyle.DropDownList; 
    cmb.SelectedIndexChanged += new EventHandler(cmb_SelectedIndexChanged); 
    cmb.Leave += new EventHandler(cmb_Leave); 

    return cmb; 
} 

El problema es que cuando se ejecuta cmb.SelectedValue = givenAnswers[0].AnswerId; cmb.SelectedValue siempre es nula.

Al depurar y exploro answers (el origen de datos) veo que Id (ValueMember) es exactamente igual que AnswerId (en la sentencia if). Ambos tienen el mismo tipo (largo) y el mismo valor, pero SelectedValue permanece nulo.

¿Hay algo que no vea?

EDIT:

Parece que el cuadro combinado se queda vacía. Cuando reemplazo cmb.SelectedValue = givenAnswers[0].AnswerId; con cmb.SelectedIndex = 0; obtengo una excepción ArgumentOutOfRangeException. Esto mientras que las colecciones de respuestas cuentan como 2. Entonces, el origen de datos no es nulo ... Muy fuerte, ¿eh?

Solución:

El SelectedValue, SelectedIndex, propiedades selectedItem no se pueden ajustar hasta que se añade el control al formulario. Después de agregar el control al formulario, se pueden establecer las propiedades SelectedValue, -Index y -Item.

Respuesta

6

Solución:

El SelectedValue, SelectedIndex, propiedades selectedItem no se pueden ajustar hasta que se añade el control al formulario. Después de agregar el control al formulario, se pueden establecer las propiedades SelectedValue, -Index y -Item.

0

Asegúrese de que QuestionAnswer tenga los accesos públicos correspondientes (mismo nombre) a los Miembros de Display/Value que use.

+0

PreguntaLa respuesta es una subclase. La clase base contiene las propiedades Id y Answer, que son públicas con un getter y un setter. – Martijn

3

me encontré con este problema raro antes, al fin me di por vencido y se utiliza de otra manera:

cmb.Items.FindByValue(givenAnswers[0].AnswerId).Selected = true; 

Trabajó muy bien ... Uno espera buena suerte!

+0

No tengo el método FindByValue. Tal vez es porque estoy usando winforms? – Martijn

+0

WinForm Combo también debe tener un método como FindByValue del control web (tal vez un nombre diferente). Intentalo. –

+0

He agregado una respuesta por separado que aborda esto: intente utilizar FindString o FindStringExact en DisplayMember. – Billious

1

¿Está buscando en la misma propiedad?

cmb.ValueMember = "Id"; 
.. 
cmb.SelectedValue = givenAnswers[0].AnswerId; 

Usted se está refiriendo a otro ValueMember luego el ID que está publicando en el SelectedValue. Además de eso, es posible que desee intentar configurar su Display-and-Value-member antes de enlazar datos. Es mas rapido.

+0

El origen de datos contiene una clase diferente. givenAnswers contiene otra clase, pero el valor de AnswerId y Id es el mismo. – Martijn

+0

¿Los mismos tipos o los mismos valores? – riffnl

0

Me encontré con el mismo problema, y ​​encontré que mi problema era que estaba tratando SelectedValue como un entero, cuando en realidad era un objeto. La solución "FindByValue" de Danny Chen anterior no funciona en Windows Forms, por lo que trató de usar "FindStringExact" y buscado en la DisplayMember:

cmb.Items.FindStringExact(<Display string>) 

No es una solución ideal, pero funcionó.

3
cmb.SelectedIndex = cmb.FindStringExact("Desired Value") 

El cmb.FindStringExact ("cadena deseada") devuelve el índice del valor que desea seleccionar y el cmb.SelectedIndex establece el cuadro combinado a ese índice.

¡Gracias a Billious por mostrarme la luz!

FYI - Esta es la versión de VB.NET Winforms.

Cuestiones relacionadas