【问题标题】:C# bind to comboBox without selectedItem and text populationC# 绑定到没有 selectedItem 和文本填充的组合框
【发布时间】:2012-11-09 16:56:42
【问题描述】:

我的问题是“有没有办法在不更改/填充 selectedItem 和文本值的情况下将数据绑定到组合框?” (我希望组合框保持空白)

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

        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;

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

但是,如果您单步执行代码,您会看到当将 DataSource 分配给“list”时,SelectedItem 和 Text 值发生了变化。

我的实际 LINQ 查询要大一些,因此加载速度较慢。我的组合框在 Text 值被清除之前“闪烁”它,我想删除这个丑陋的闪烁。

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

非常感谢任何建议! =)

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

【问题讨论】:

    标签: c# data-binding combobox selecteditem


    【解决方案1】:

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

    list.Insert(0, "");
    

    【讨论】:

    • 这对我来说有点不受欢迎,因为这会在我的组合框中留下一个空白项......但是,这是迄今为止唯一有效的东西......所以除非有人想出更好的答案,我将不得不坚持这个...谢谢!
    【解决方案2】:

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

    【讨论】:

    • 这听起来是个好主意,但对我不起作用......可能是我有其他奇怪的事情发生,但这不是严格与布局属性有关吗?根据 MSDN,The SuspendLayout and ResumeLayout methods are used in tandem to suppress multiple Layout events while you adjust multiple attributes of the control.
    • @JamesEkema - 我很确定我已经为此使用了它,但在回答之前我没有重新测试它。不过,我很高兴你找到了答案。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        这对我有用:删除绑定,然后在设置 DataSource 后将它们添加回来:

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

        【讨论】:

          【解决方案6】:

          我对此问题的解决方案是在表单构造函数中添加一个数据源,然后在 form_Load 中将其更改为 null,之后,当我使用列表设置数据源时,组合框中的文本保持空白

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-07-23
            • 1970-01-01
            • 2016-02-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-05
            相关资源
            最近更新 更多