2010-05-19 11 views
8

Ich schaffe dynamisch eine Combobox wie folgt aus:C# Set Combo Artikel mit 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; 
} 

Das Problem ist, wenn die Ausführung cmb.SelectedValue = givenAnswers[0].AnswerId; cmb.SelectedValue immer null ist.

Beim Debuggen und ich erkunde answers (die Datenquelle) Ich sehe, dass Id (ValueMember) ist genau dasselbe wie AnswerId (in der if-Anweisung). Beide haben denselben Typ (lang) und denselben Wert, aber SelectedValue bleibt null.

Gibt es etwas, das ich nicht sehe?

EDIT:

Es sieht aus wie die Combobox leer bleibt. Wenn ich cmb.SelectedValue = givenAnswers[0].AnswerId; durch cmb.SelectedIndex = 0; ersetze, erhalte ich eine ArgumentOutOfRangeException. Dies, während die Antworten Sammlungen zählt 2. Also ist die Datenquelle nicht null ... Sehr strenge huh?

Lösung:

Die SelectedValue, SelectedIndex, SelectedItem Eigenschaften können nicht eingestellt werden, bis die Steuerung zu dem Formular hinzugefügt wird. Nachdem das Steuerelement dem Formular hinzugefügt wurde, können die Eigenschaften selectedValue, -Index und -Item festgelegt werden.

Antwort

6

Lösung:

Die SelectedValue, SelectedIndex, SelectedItem Eigenschaften können nicht eingestellt werden, bis die Steuerung zu dem Formular hinzugefügt wird. Nachdem das Steuerelement dem Formular hinzugefügt wurde, können die Eigenschaften selectedValue, -Index und -Item festgelegt werden.

0

Stellen Sie sicher, dass QuestionAnswer über öffentliche Accessors verfügt, die (denselben Namen) den von Ihnen verwendeten Display/Value-Elementen entsprechen.

+0

QuestionAnswer ist eine Unterklasse. Die Basisklasse enthält die Eigenschaften Id und Antwort, die beide mit einem Getter und Setter public sind. – Martijn

3

traf ich diese seltsame Frage vor, schließlich gab ich auf und verwendet einen anderen Weg:

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

Es funktionierte gut ... Hoffe, Ihnen viel Glück!

+0

Ich habe nicht die Methode FindByValue. Vielleicht liegt es daran, dass ich Winforms verwende? – Martijn

+0

WinForm Combo muss auch eine solche Methode wie FindByValue des Web-Control (vielleicht einen anderen Namen) haben. Versuch es. –

+0

Ich habe eine separate Antwort zu diesem Thema hinzugefügt - versuchen Sie es mit FindString oder FindStringExact auf dem DisplayMember. – Billious

1

Sind Sie in der gleichen Immobilie?

Sie verweisen auf ein anderes ValueMember und dann auf die ID, die Sie in SelectedValue veröffentlichen. Außerdem sollten Sie versuchen, Ihr Display- und Value-Mitglied vor der Datenbindung einzustellen. Es ist schneller.

+0

Die Datenquelle enthält eine andere Klasse. givenAnswers enthält eine andere Klasse, aber der Wert von AnswerId und ID ist identisch. – Martijn

+0

Gleiche Typen oder gleiche Werte? – riffnl

0

Ich stieß auf das gleiche Problem, und mein Problem war, dass ich SelectedValue als Integer behandelte, obwohl es tatsächlich ein Objekt war. Die „FindByValue“ Lösung von Danny Chen oben funktioniert nicht in WinForms, also habe ich versucht „Findstringexact“ mit und suchten auf dem Display:

cmb.Items.FindStringExact(<Display string>) 

keine ideale Lösung, aber es funktionierte.

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

The cmb.FindStringExact ("Desired String") gibt den Index des Werts, den Sie auswählen möchten und die cmb.SelectedIndex setzt die Combobox zu diesem Index.

Danke an Billious, dass er mir das Licht gezeigt hat!

FYI - Dies ist die VB.NET Winforms Version.