在组合框显示之前更改它的SelectedValue

时间:2010-11-02 04:55:57

标签: c# winforms combobox datasource bindingsource

问题很奇怪,我有一个通过DataSource属性正确填充项目的组合框(它绑定到一个bindingSource项,其中包含一个显示成员和一个值成员),这是一个简单的组合框,允许我选择供应商通过选择他们的名字而不是他们的ID。 问题是,当我更改SelectedValue因为我想要一个选项设置为默认值时,我发现List属性为空(我在另一个中继承了组合框),但是当显示组合框时,我有里面的项目,所以问题可能与WHEN数据真正从数据源加载有关(也许它只在显示后才加载?)。我应该何时更改我的SelectedValue?控件中没有任何“已显示”事件

感谢您的任何建议

更新1: 我按照你的方式进行了测试,但不是这种情况(关键是长的,但即使我把它投入也不行),实际上有趣的是我有一个setter,允许我设置SelectedValue,即使它没有'抛出异常,在下一个MessageBox中,Items.Count给我0作为值,这很奇怪,因为当组合框显示在表单上时它具有我想要的所有值。这是我的二传手的代码:

    public object InputValue
    {
        get
        {
            return SelectedValue;
        }
        set
        { 
            SelectedValue = ((long)value);
            MessageBox.Show(this.Items.Count.ToString());
        }
    }

3 个答案:

答案 0 :(得分:1)

你不是唯一经历过这个问题的人,很高兴听到这不仅仅是我。没有发生的事情与类型转换有关 - 如果您在数据源中明确地将SelectedValue转换为完全类型,您会发现您可以设置值成功。

例如:

comboBox1.ValueMember = "Value";
comboBox1.DisplayMember = "Key";
object ds = new KeyValuePair<string, long>[] {
    new KeyValuePair<string,long>("a",0),
    new KeyValuePair<string,long>("b",1),
    new KeyValuePair<string,long>("c",2),
    new KeyValuePair<string,long>("d",3),
    new KeyValuePair<string,long>("e",4)
};
comboBox1.DataSource = ds;
comboBox1.SelectedValue = 3;        // this won't work
comboBox1.SelectedValue = (long)3;  // this will work

无论出于何种原因,即使'3'作为一个长整数等于'3'作为一个整数,ComboBox也会拒绝打球,除非你的类型精确正确。

我可以理解这与WinForms ComboBox是COM版本的包装这一事实有关,并且在创建本机控件之后会显示不同的行为。

我希望这有助于解决您的特定问题!

答案 1 :(得分:1)

我解决了这个问题,事实上我认为Items集合被“围绕”组合框的第一次失效填充,所以我只是在第一次失效之前将提交的值存储为SelectedValue,然后我只是设置了它在Invalidated事件下。

答案 2 :(得分:0)

我遇到了这个问题,我将BindingSource.Current属性与绑定源的CurrentChanged()事件一起使用,并且可以正常工作