【问题标题】:Cannot bind to the new display member in ComboBox无法绑定到 ComboBox 中的新显示成员
【发布时间】:2014-09-10 09:26:07
【问题描述】:

我有一门课给我这个错误

public class Item 
{
    public string Name;
    public int Id

    public Item(string name, int id) 
    {
        Name = name; 
        Id = id;
    }
}   

这是我的功能

 var lstItems = new List<Item>();
 while(...)
 {
     lstItems.Add(new Item(sAd_Ref, Convert.ToInt32(sAd_ID))); 
 }

 comboBox1.DataSource = lstItems;
 comboBox1.ValueMember = "Id";
 comboBox1.DisplayMember = "Name";

在倒数第二行我得到了例外

无法绑定到新的显示成员。

【问题讨论】:

    标签: c# list winforms data-binding combobox


    【解决方案1】:

    您应该创建NameId 属性。您不能将ComboBox 绑定到字段。

    public string Name { get; set; }
    public int Id { get; set; }
    

    docs中也有说明:

    ValueMember Property:获取或设置 属性 以用作 System.Windows.Forms.ListControl 中项目的实际值。

    【讨论】:

    • @Selman Genç 我知道这是一岁了 - 但你说你不能将 ComboBox 绑定到字段。 - 你有参考吗,因为我的代码有效。
    • @Ken 你应该封装你的数据。如果您的课程中有公共字段,那么您做错了。
    • @JasonG ,公共字段和公共属性的区别{get; set;} 可以忽略不计。你不知道他的情况。你能回答他的问题吗?
    【解决方案2】:

    我知道帖子很旧,但接受的答案不正确。 Op 需要更改分配 displayMember、valueMember 和 Datasource 的顺序,然后记下添加的代码行。

    comboBox1.DisplayMember="Name";
    comboBox1.ValueMember = "Id";
    comboBox1.DataSource = lstItems;
    comboBox1.BindingContext = this.BindingContext;
    

    【讨论】:

    • 顺序无关紧要,需要用到属性。
    • 这对我有用,但有一些背景或文档参考说明为什么会有用。
    • @RhysJones 我希望有它的文档,我多年前在网上找到了它。 Combobox 中似乎存在错误,并且仅在某些情况下发生。我认为它只发生在数据源是列表类型源对象而不是数据表时。我知道这很奇怪,但它在这种独特的情况下对我有用——我没有费心去深入研究它为什么会这样。你知道....我需要完成我的项目。
    • 我也有同样的情况,更改顺序对我来说效果很好。我使用 List 作为数据源。正如@Ken 提到的,对于 DataTable 没有这样的问题。
    【解决方案3】:

    在我的例子中,我确实绑定了 Browsable 属性设置为 false 的属性。

    即发生错误的原因是:

    [Browsable(false)]
    public string MyProperty { get; set; }
    

    我确实通过简单地删除属性来解决它:

    public string MyProperty { get; set; }
    

    【讨论】:

      【解决方案4】:

      设置值成员和显示成员后,可以检查数据源是否为空或绑定数据源

              cmbDepartment.DisplayMember = "Dep_Name";
              cmbDepartment.ValueMember = "Dep_ID";
              cmbDepartment.DataSource = model;
      

      【讨论】:

        【解决方案5】:

        tldr:确保要绑定的源不为空。

        我收到了同样的错误信息

        '无法绑定到新的显示成员。参数名称:newDisplayMember'

        来自看起来像的代码

        bindingSource.DataSource = _MyDict;
        comboBox.DisplayMember = "Value";
        comboBox.ValueMember = "Key";
        

        绑定源已经连接到设计器中。

        当您设置ValueMember 属性时,组合框将尝试在您的列表中找到一个实例以使用反射(可能检查该属性是否确实存在)。当源集合当前为空时,此操作会失败。

        【讨论】:

          【解决方案6】:

          就我而言,当我认为我正在绑定到 DataTable 时,我正在绑定到 DataSet。

          【讨论】:

          • 同样的错误 :(
          【解决方案7】:
          if (lstItems.Count > 0)
          {
              comboBox1.DataSource = lstItems;
              comboBox1.DisplayMember = "Name";
              comboBox1.ValueMember = "Id";
          }
          

          【讨论】:

            【解决方案8】:

            我的问题是我的数据源是类型列表 所以我只是测试一下

            public static void AddDataSource<T>(this ComboBox comboBox, T dataSource, string item)
            {
                comboBox.DataSource = dataSource;
            
                if (!typeof(T).Equals(typeof(List<string>))) // <-- Here
                {
                    comboBox.DisplayMember = "Name";
                    comboBox.ValueMember = "Value";
                }
            
                comboBox.SelectedIndex = -1;
                comboBox.Text = $"Select a {item}";
            }
            

            【讨论】:

              【解决方案9】:

              就我而言,我通过确定设置属性的顺序解决了同样的问题:

              With ComboBoxPartNumber
               .DisplayMember = "SuperSKU"
               .ValueMember = "TareRequired"
               .DataSource = _TblNP
               .Enabled = True
               .Refresh()
              With
              

              这里的_TblNP 字段是System.Data.DataTable 类型的全局本地字段。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2023-03-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多