C#使用selectedValue设置组合项

我正在动态创建一个这样的combobox:

public Control GenerateList(Question question) { // Get a list with answer possibilities List answers = question.GetAnswers(); // Get a collection of given answers Collection 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始终为null。

在调试和探索answers (数据源)时,我看到Id(ValueMember)与AnswerId(在if语句中)完全相同。 两者都具有相同的类型(长)和相同的值,但SelectedValue保持为null。

有没有我看不到的东西?

编辑:

看起来combobox保持空白。 当我替换cmb.SelectedValue = givenAnswers[0].AnswerId;cmb.SelectedIndex = 0; 我得到一个ArgumentOutOfRangeException。 这个答案集合数是2.所以数据源不是空的……非常好吧?

解:

在将控件添加到表单之前,无法设置SelectedValue,SelectedIndex,SelectedItem属性。 将控件添加到表单后,可以设置selectedValue,-Index和-Item属性。

解:

在将控件添加到表单之前,无法设置SelectedValue,SelectedIndex,SelectedItem属性。 将控件添加到表单后,可以设置selectedValue,-Index和-Item属性。

我之前遇到过这个奇怪的问题,最后我放弃了另一种方式:

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

它工作得很好……希望你好运!

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

cmb.FindStringExact(“Desired String”)返回您要选择的值的索引,cmb.SelectedIndex将combobox设置为该索引。

感谢Billious向我展示了光明!

仅供参考 – 这是VB.NET Winforms版本。

你在看同一家酒店吗?

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

您正在引用另一个ValueMember,然后是您要发布到SelectedValue的ID。 除此之外,您可能希望在数据绑定之前尝试设置Display-和Value-member。 它更快。

确保QuestionAnswer具有与您使用的显示/值成员相对应(相同名称)的公共访问者。

我遇到了同样的问题,发现我的问题是我将SelectedValue视为一个整数,实际上它是一个对象。 上面Danny Chen的“FindByValue”解决方案在WinForms中不起作用,所以我尝试使用“FindStringExact”并在DisplayMember上搜索:

 cmb.Items.FindStringExact() 

不是一个理想的解决方案,但它有效。