C#绑定到没有selectedItem和文本填充的comboBox

时间:2012-11-09 16:56:43

标签: c# data-binding combobox selecteditem

我的问题是“有没有办法将数据绑定到comboBox而没有selectedItem和文本值被更改/填充?” (我希望comboBox保持空白)

这是我正在做的事情的例子:

        Dictionary<int,string> test = new Dictionary<int,string>();
        test.Add(1, "Company1");
        test.Add(2, "Company2");
        test.Add(3, "Company3");
        test.Add(4, "Company4");
        test.Add(5, "Company5");
        test.Add(6, "Company6");

        var list = test.Select(x => new { CompanyName = x.Value }).ToList();

        comboBox1.DataSource = list;
        comboBox1.DisplayMember = "CompanyName";
        comboBox1.ValueMember = "CompanyName";
        comboBox1.SelectedItem = null;

如果运行此代码,它可以正常工作,因为它加载速度很快,看起来comboBox保持空白。

但是,如果单步执行代码,则会在DataSource分配给“list”时看到SelectedItem和Text值发生更改。

我的实际LINQ查询相当大,因此加载速度较慢。我的comboBox在它被清除之前“闪烁”了Text值,我想删除这个丑陋的闪存。

我尝试过在DataSource赋值之前和之后将SelectedItem和Text值设置为null(或“”)的不同组合,但是我无法让“flash”消失。

非常感谢任何建议! =)

编辑:我还想补充一点,这只发生在初始表单加载中...如果我更改了绑定源然后重置回原来的(再次运行完全相同的代码),它不会“闪现”......不确定这是否有帮助或有所作为......

5 个答案:

答案 0 :(得分:1)

尝试在数据绑定代码周围使用comboBox1.SuspendLayout()comboBox1.ResumeLayout()。第一个应该阻止它更新,直到第二个被调用。

答案 1 :(得分:1)

另一个简单的建议是将空白CompanyName添加为列表中的第一项

list.Insert(0, "");

答案 2 :(得分:1)

在设置comboBox1.DataSource之前,在列表中添加一个null-Reference作为第一个list-element。

 var list = test.Select(x => new { CompanyName = x.Value }).ToList();
 list.Insert(0, null);
 comboBox1.DataSource = list;

答案 3 :(得分:0)

我遇到了同样的问题,但是我无法添加一个空项目,所以我做的是:

comboBox.ForeColor = comboBox.BackColor;
//set the combobox datasource
comboBox.ForeColor = SystemColors.WindowText;

这使得组合框在设置数据源时看起来是空白而不添加空项目。

答案 4 :(得分:0)

这对我有用:删除绑定,然后在设置数据源后将其重新添加:

Binding[] bindings = new Binding[combo.DataBindings.Count];
combo.DataBindings.CopyTo(bindings, 0);
combo.DataBindings.Clear();
combo.DataSource = datasource;
combo.SelectedIndex = -1;
foreach (Binding b in bindings)
{
    combo.DataBindings.Add(b);
}