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.
QuestionAnswer è una sottoclasse. La classe base contiene le proprietà Id e Answer, che sono pubbliche con un getter e un setter. – Martijn