我正在动态创建这样的组合框:
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始终为null。
在调试时,我探索answers
(数据源),我发现Id(ValueMember)与AnswerId(在if语句中)完全相同。两者都具有相同的类型(长)和相同的值,但SelectedValue保持为空。
有什么我看不到的吗?
修改
看起来组合框保持空白。当我用cmb.SelectedValue = givenAnswers[0].AnswerId;
替换cmb.SelectedIndex = 0;
时,我得到一个ArgumentOutOfRangeException。这个答案集合数是2.所以数据源不是空的......非常好吗?
解决方案:
在将控件添加到表单之前,无法设置SelectedValue,SelectedIndex,SelectedItem属性。将控件添加到表单后,可以设置selectedValue,-Index和-Item属性。
答案 0 :(得分:7)
解决方案:
在将控件添加到表单之前,无法设置SelectedValue,SelectedIndex,SelectedItem属性。将控件添加到表单后,可以设置selectedValue,-Index和-Item属性。
答案 1 :(得分:3)
之前我遇到过这个奇怪的问题,最后我放弃了,并采用了另一种方式:
cmb.Items.FindByValue(givenAnswers[0].AnswerId).Selected = true;
工作得很好......希望你好运!
答案 2 :(得分:3)
cmb.SelectedIndex = cmb.FindStringExact("Desired Value")
cmb.FindStringExact(&#34; Desired String&#34;)返回您想要选择的值的索引,cmb.SelectedIndex将组合框设置为该索引。
感谢Billious向我展示了光明!
仅供参考 - 这是VB.NET Winforms版本。
答案 3 :(得分:1)
你在看同一家酒店吗?
cmb.ValueMember = "Id";
..
cmb.SelectedValue = givenAnswers[0].AnswerId;
您正在引用另一个ValueMember,然后是您在SelectedValue中发布的ID。 除此之外,您可能希望在数据绑定之前尝试设置Display-和Value-member。它更快。
答案 4 :(得分:0)
确保QuestionAnswer
的公共访问者与您使用的显示/值成员对应(名称相同)。
答案 5 :(得分:0)
我遇到了同样的问题,发现我的问题是我将SelectedValue视为一个整数,实际上它是一个对象。上面Danny Chen的“FindByValue”解决方案在WinForms中不起作用,所以我尝试使用“FindStringExact”并在DisplayMember上搜索:
cmb.Items.FindStringExact(<Display string>)
不是理想的解决方案,但它有效。