我的问题是“有没有办法将数据绑定到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”消失。
非常感谢任何建议! =)
编辑:我还想补充一点,这只发生在初始表单加载中...如果我更改了绑定源然后重置回原来的(再次运行完全相同的代码),它不会“闪现”......不确定这是否有帮助或有所作为......
答案 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);
}