C# C绑定到组合框而不选择编辑项和文本填充

C# C绑定到组合框而不选择编辑项和文本填充,c#,data-binding,combobox,selecteditem,C#,Data Binding,Combobox,Selecteditem,我的问题是,有没有一种方法可以将数据绑定到组合框而不更改/填充selectedItem和text值?我希望组合框保持空白 这是我正在做的一个例子: Dictionary<int,string> test = new Dictionary<int,string>(); test.Add(1, "Company1"); test.Add(2, "Company2"); test.Add(3, "Company3"

我的问题是,有没有一种方法可以将数据绑定到组合框而不更改/填充selectedItem和text值?我希望组合框保持空白

这是我正在做的一个例子:

        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;
如果您运行这段代码,它工作得很好,因为它加载得很快,看起来组合框保持空白

但是,如果您单步执行代码,您将看到,当数据源被分配给list时,SelectedItem和Text值会发生更改

我的实际LINQ查询比较大,因此加载速度较慢。我的组合框在清除文本值之前会闪烁,我想删除这个丑陋的闪烁

我尝试过将SelectedItem和Text值设置为null或在数据源分配前后的不同组合,但我无法让flash消失

非常感谢您的任何建议=


编辑:我还想补充一点,这只发生在初始表单加载时。。。如果我更改bindingsource,然后重新设置为原来运行完全相同的代码,它不会闪烁。。。不确定这是否有帮助或有区别…

尝试在数据绑定代码周围使用comboBox1.SuspendLayout和comboBox1.ResumeLayout。在调用第二个之前,第一个应该阻止它进行更新。

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

< P>另一个简单的建议是只添加空白的公司名称作为列表

中的第一个项目。
list.Insert(0, "");

另一个简单的建议是将空白的公司名称作为列表

中的第一项添加。
list.Insert(0, "");

在设置comboBox1.DataSource之前,将空引用添加到列表中作为第一个列表元素

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

在设置comboBox1.DataSource之前,将空引用添加到列表中作为第一个列表元素

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

我遇到了相同的问题,但我无法添加空项,因此我所做的是:

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

这使得组合框在设置数据源时显示为空,而不添加空项。

我遇到了相同的问题,但我无法添加空项,因此我所做的是:

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

这使得组合框在设置数据源时显示为空,而不添加空项。

这对我来说很有效:删除绑定,然后在设置数据源后重新添加它们:

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);
}

这对我来说很有效:删除绑定,然后在设置数据源后重新添加它们:

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);
}

这对我来说有点不受欢迎,因为这会在我的组合框中留下一个空白项。。。但是,这是迄今为止唯一有效的方法。。。所以除非有人能想出更好的答案,否则我只能坚持这个。。。谢谢这对我来说有点不受欢迎,因为这会在我的组合框中留下一个空白项。。。但是,这是迄今为止唯一有效的方法。。。所以除非有人能想出更好的答案,否则我只能坚持这个。。。谢谢这听起来是个好主意,但对我不起作用。。。这可能是因为我有其他奇怪的事情发生,但这不一定与布局属性有严格的关系吗?根据MSDN,SuspendLayout和ResumeLayout方法在您调整控件的多个属性时串联使用以抑制多个布局事件。@JamesEkema-我很确定我已经为此使用了它,但在回答之前我没有重新测试它。不过,我很高兴你找到了答案。这听起来是个好主意,但对我不起作用。。。这可能是因为我有其他奇怪的事情发生,但这不一定与布局属性有严格的关系吗?根据MSDN,SuspendLayout和ResumeLayout方法在您调整控件的多个属性时串联使用以抑制多个布局事件。@JamesEkema-我很确定我已经为此使用了它,但在回答之前我没有重新测试它。不过,我很高兴你找到了答案。