C#使用selectedValue设置组合项

时间:2010-05-19 08:56:45

标签: c# winforms combobox

我正在动态创建这样的组合框:

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属性。

6 个答案:

答案 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>)

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