ListBox не показывает изменения в DataSource - PullRequest
6 голосов
/ 22 октября 2009

Я думал, что это простая проблема, но я не могу найти какую-либо информацию в Интернете. Я связываю ListBox с List, используя BindingSource примерно так:

List<Customer> customers = MyMethodReturningList();

BindingSource customersBindingSource = new BindingSource();
customersBindingSource.DataSource = customers;

customersListBox.DataSource = customersBindingSource;

Теперь, когда я добавляю или удаляю из списка customers, мой ListBox обновляется (даже без использования ResetBindings на BindingSource), но если я изменяю какой-либо объект клиента в списке, он делает не. Вызов ResetBindings не имеет никакого эффекта. Я даже реализовал свой BindingList, но поведение не изменилось.
Класс Customer использует свойства для доступа и изменения данных. Его содержимое ToString() отображается в списке.

Я использую C # в .Net 2.0.

Есть идеи?

Спасибо

Ответы [ 5 ]

5 голосов
/ 17 января 2013

Если вы используете BindingList, вам даже не нужно BindingSource:

BindingList<Customer> customers = new BindingList<Customer>(MyMethodReturningList());
customersListBox.DataSource = customers;
4 голосов
/ 28 января 2010

Хорошо, вот грязное исправление: когда вам нужно обновить содержимое коробки, установите datasource = null, а затем перепривязайте его.

причина, по которой он не обновляется, заключается в том, что объекты в списке не изменились, и он проверяет только ссылки на объекты, а не их содержимое.

2 голосов
/ 01 августа 2012

В списке также есть ошибка, которая может вызвать эту проблему. Если вы установите SelectionMode на Нет , эта проблема появляется.

В качестве обходного пути я установил режим выбора на Один, а затем снова на Нет при обновлении источника данных.

0 голосов
/ 30 января 2015

Я понимаю, что этот вопрос задавался почти 6 лет назад, но кроме обходных путей, я не вижу правильного ответа здесь. Когда вы изменяете свойство элемента в коллекции, событие вызывается для элемента (объекта), но не для коллекции. Таким образом, коллекция не видит изменений и не обновляет связанные элементы управления. Элементы внутри всех обязательных коллекций и наиболее общих коллекций, таких как List<>, получают 2 события, PropertyChanging и PropertyChanged. Когда свойство элемента внутри коллекции изменяется, событие инициируется. Все, что вам нужно сделать, это добавить обработчик событий, который будет вызывать либо повторную привязку, либо вызывать событие на Collection.

0 голосов
/ 13 октября 2014

Я справился с этой проблемой, преобразовав данные в массив при обновлении источника. Пожалуйста, смотрите метод UpdateData. Таким образом, вы можете обновить поле со списком без потери настроек ComboBox.

class Person {
   public int Id {get; set; }
   public string FirstName{ get; set; }
   public string SurName {get; set; }
}

public Form1()
{
    InitializeComponent();
    comboBox1.DisplayMember = "FirstName";
    comboBox1.ValueMember = "Id";
    comboBox1.DataSource = m_PersonList;
}

public void UpdateData() {
    m_PersonList[0].FirstName = "Firstname1";
    comboBox1.DataSource = m_PersonList.ToArray<Person>();
}
...