2010-05-19 16 views
8

Sto generando dinamicamente una casella combinata in questo modo:C# Imposta voce combo 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; 
} 

Il problema è che quando si eseguono cmb.SelectedValue = givenAnswers[0].AnswerId; cmb.SelectedValue è sempre nullo.

Quando eseguo il debug ed esploro answers (l'origine dati), vedo che Id (ValueMember) è esattamente uguale a AnswerId (nell'istruzione if). Entrambi hanno lo stesso tipo (long) e lo stesso valore, ma SelectedValue rimane nullo.

C'è qualcosa che non vedo?

EDIT:

Sembra che la casella combinata rimane vuota. Quando sostituisco cmb.SelectedValue = givenAnswers[0].AnswerId; con cmb.SelectedIndex = 0; ottengo ArgumentOutOfRangeException. Questo mentre le raccolte di risposte contano è 2. Quindi l'origine dati non è nulla ... Molto forte eh?

Soluzione:

Il SelectedValue, SelectedIndex, SelectedItem proprietà non possono essere impostate quando non viene aggiunto il controllo al modulo. Dopo che il controllo è stato aggiunto al modulo, è possibile impostare le proprietà selectedValue, -Index e -Item.

risposta

6

Soluzione:

Il SelectedValue, SelectedIndex, SelectedItem proprietà non possono essere impostate quando non viene aggiunto il controllo al modulo. Dopo che il controllo è stato aggiunto al modulo, è possibile impostare le proprietà selectedValue, -Index e -Item.

0

Assicurarsi che QuestionAnswer abbia accessors pubblici corrispondenti (lo stesso nome) ai membri Display/Value che si utilizzano.

+0

QuestionAnswer è una sottoclasse. La classe base contiene le proprietà Id e Answer, che sono pubbliche con un getter e un setter. – Martijn

3

Ho incontrato questo problema strano, prima, alla fine ho rinunciato e utilizzato in un altro modo:

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

Ha funzionato bene ... si spera buona fortuna!

+0

Non ho il metodo FindByValue. Forse è perché sto usando winforms? – Martijn

+0

WinForm Combo deve anche avere un metodo come FindByValue del controllo web (forse un nome diverso). Provalo. –

+0

Ho aggiunto una risposta separata che risolve questo problema: prova a utilizzare FindString o FindStringExact su DisplayMember. – Billious

1

Stai guardando la stessa proprietà?

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

Ti stai riferendo a un altro ValueMember quindi all'ID che stai postando nel SelectedValue. Oltre a ciò, è possibile provare a impostare il membro Display e Value prima del collegamento dati. È più veloce

+0

L'origine dati contiene una classe diversa. givenAnswers contiene un'altra classe, ma il valore di AnswerId e Id è lo stesso. – Martijn

+0

Stessi tipi o stessi valori? – riffnl

0

Mi sono imbattuto nello stesso problema e ho scoperto che il mio problema era che stavo trattando SelectedValue come un intero, quando in realtà era un oggetto. La soluzione "FindByValue" di Danny Chen sopra non funziona in WinForms, così ho provato ad utilizzare "FindStringExact" e cercato sul DisplayMember:

cmb.Items.FindStringExact(<Display string>) 

Non una soluzione ideale, ma ha funzionato.

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

Il cmb.FindStringExact ("Desired String") restituisce l'indice del valore che si desidera selezionare e il cmb.SelectedIndex imposta la casella combinata a tale indice.

Grazie a Billious per avermi mostrato la luce!

FYI - Questa è la versione di Winform VB.NET.

Problemi correlati