C# 在显示组合框之前更改其SelectedValue

C# 在显示组合框之前更改其SelectedValue,c#,winforms,combobox,datasource,bindingsource,C#,Winforms,Combobox,Datasource,Bindingsource,问题很奇怪,我有一个组合框,它通过绑定到bindingSource项目的数据源属性正确填充了项目,其中包含一个displaymember和一个valuemember。这是一个简单的组合框,允许我通过在供应商的名称而不是ID之间进行选择来选择供应商。 问题是,当我更改SelectedValue时,因为我希望将一个选项设置为默认选项,我发现List属性为空,我在另一个属性中继承了combobox类,但是当显示combobox时,我在其中有项,因此,问题可能与何时真正从数据源加载数据有关,可能只是在显

问题很奇怪,我有一个组合框,它通过绑定到bindingSource项目的数据源属性正确填充了项目,其中包含一个displaymember和一个valuemember。这是一个简单的组合框,允许我通过在供应商的名称而不是ID之间进行选择来选择供应商。 问题是,当我更改SelectedValue时,因为我希望将一个选项设置为默认选项,我发现List属性为空,我在另一个属性中继承了combobox类,但是当显示combobox时,我在其中有项,因此,问题可能与何时真正从数据源加载数据有关,可能只是在显示数据后才加载数据?。我应该在什么时候更改SelectedValue?控件中没有显示任何事件

谢谢你的建议

更新1: 我用你的方式测试了,但不是这样,键很长,但即使我强制转换它也不起作用,事实上有趣的是,我有一个setter,它允许我设置SelectedValue,即使不抛出异常,在下一个消息框中设置项。Count给我0作为值,这很奇怪,因为当组合框显示在表单上时,它具有我想要的所有值。下面是我的setter的代码:

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

你不是唯一一个经历过这个问题的人,很高兴听到不仅仅是我。没有发生的事情与类型转换有关-如果您显式地将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
无论出于何种原因,即使作为long的“3”等于作为int的“3”,组合框也拒绝打球,除非您得到的类型完全正确

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


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

我解决了这个问题,事实上,我认为条目集合是在组合框第一次失效时填充的,因此,我只是在第一次失效之前将提交的值作为SelectedValue存储在一个临时变量中,然后将其设置在失效事件下。

我有这个问题,我使用BindingSource.Current属性和绑定源的CurrentChanged事件,它能正常工作。

问题不是,看着我的问题更新,我会更好地解释它;顺便说一句,我也注意到了你所说的问题,事实上我必须投下它来让它发挥作用参见我对金的回答的评论: