Невозможно связать с новым элементом отображения в combobox

У меня есть класс, который дает мне эту ошибку

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";

Во второй последней строке я получаю исключение

Невозможно связать новый элемент отображения.

Ответ 1

Вы должны сделать свойства Name и Id. Вы не можете привязать ComboBox к полям.

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

Он также заявил в docs:

ValueMember Property: Получает или задает свойство, используемое в качестве фактического значения для элементов в System.Windows.Forms.ListControl.

Ответ 2

Я знаю, что сообщение устарело, но принятый ответ неверен. Op необходимо было изменить порядок присвоения displayMember, valueMember и Datasource, а затем отметить добавленную строку кода.

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

Ответ 3

В моем случае я привязывался к свойствам, у которых атрибут Browsable установлен на false.

т.е. ошибка произошла из-за:

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

И я решил это, просто удалив атрибут:

public string MyProperty { get; set; }

Ответ 4

Моя проблема заключалась в том, что мой источник данных имел тип списка <string>, поэтому я просто проверить это

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

Ответ 5

TL;DR: убедитесь, что источник, к которому вы привязываетесь, не пустой.

Я получаю то же сообщение об ошибке

"Невозможно привязать новый элемент отображения. Имя параметра: newDisplayMember"

Из кода, который выглядел как

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

С источником привязки уже подключен конструктор.

Когда вы устанавливаете свойство ValueMember список будет пытаться найти экземпляр в вашем списке, чтобы использовать отражение (возможно, чтобы проверить, действительно ли свойство существует). Это не удается, если исходная коллекция в настоящее время пуста.

Ответ 6

В моем случае я связывался с DataSet, когда думал, что связываюсь с DataTable.

Ответ 7

if (lstItems.Count > 0)
{
    comboBox1.DataSource = lstItems;
    comboBox1.DisplayMember = "Name";
    comboBox1.ValueMember = "Id";
}