Невозможно связать с новым элементом отображения в 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";
}