2010-05-19 27 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版本。