2010-05-19 55 views
8

我動態創建一個組合框是這樣的:C#套裝組合產品與了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; 
} 

的問題是,執行cmb.SelectedValue = givenAnswers[0].AnswerId; cmb.SelectedValue總是空當。

當調試和我探索answers(數據源)時,我發現Id(ValueMember)與AnswerId(在if語句中)完全相同。兩者具有相同的類型(長)和相同的值,但是SelectedValue保留爲空。

有什麼我看不到?

編輯:

它看起來像組合框保持爲空。當我將cmb.SelectedValue = givenAnswers[0].AnswerId;替換爲cmb.SelectedIndex = 0;時,我得到一個ArgumentOutOfRangeException。這個雖然答案集合計數是2.所以數據源不是空的......非常的強烈吧?

解決方案:

的的SelectedValue,SelectedIndex的,的SelectedItem屬性不能直到控制被添加到形式設置。將控件添加到窗體後,可以設置selectedValue,-Index和-Item屬性。

回答

6

解決方案:

的的SelectedValue,SelectedIndex的,的SelectedItem屬性不能直到控制被添加到形式設置。將控件添加到窗體後,可以設置selectedValue,-Index和-Item屬性。

0

確保QuestionAnswer具有與您使用的顯示/值成員對應(相同名稱)的公共訪問器。

+0

QuestionAnswer是一個子類。基類包含Id和Answer屬性,它們都是公共的getter和setter。 – Martijn 2010-05-19 09:09:10

3

我以前見過這個奇怪的問題,最後我放棄了,用另一種方式:

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

它工作得很好...希望你好運!

+0

我沒有方法FindByValue。也許這是因爲我使用winforms? – Martijn 2010-05-19 09:10:58

+0

WinForm組合還必須具有Web控件的FindByValue(可能是不同的名稱)之類的方法。嘗試一下。 – 2010-05-21 03:29:15

+0

我已經添加了一個單獨的答案來解決這個問題 - 嘗試在DisplayMember上使用FindString或FindStringExact。 – Billious 2011-08-17 04:53:43

1

你在看同一個屬性嗎?

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

您指的是另一個ValueMember,然後是您發佈到SelectedValue中的Id。 除此之外,您可能想要在數據綁定之前嘗試設置您的Display和Value成員。速度更快。

+0

數據源包含一個不同的類。 givenAnswers包含另一個類,但AnswerId和Id的值是相同的。 – Martijn 2010-05-19 09:16:07

+0

相同的類型或相同的值? – riffnl 2010-05-19 10:43:00

0

我遇到了同樣的問題,發現我的問題是我將SelectedValue當作整數處理,實際上它是一個對象。丹尼陳「FindByValue」解決方案上面不WinForms的工作,所以我嘗試使用「FindStringExact」和搜查將DisplayMember:

cmb.Items.FindStringExact(<Display string>) 

不是一個理想的解決方案,但它的工作。

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

的cmb.FindStringExact(「所需的字符串」)返回您想選擇價值指數和cmb.SelectedIndex設置組合框到該索引。

感謝Billious給我看光!

僅供參考 - 這是VB.NET Winforms版本。