Подтвердить что ты не робот

С# DataGridView не обновляется при изменении источника данных

У меня есть список объектов

List<MobilePhone> results;

поэтому я добавил список в datagridview

dataGridView.DataSource = phase3Results;

поэтому у меня есть несколько раскрывающихся ящиков, которые диктуют результаты списка при любом изменении выбранного элемента в раскрывающихся списках, поэтому мои результаты списка меняются, но на datagridview его не отражено. есть ли способ "обновить" изменения?

4b9b3361

Ответ 1

Быстрое и грязное решение:

dataGridView.DataSource = null;
dataGridView.DataSource = phase3Results;

Чистое и правильное решение:

Используйте BindingList<T> вместо List<T> как ваш источник данных. List<T> не срабатывает при изменении коллекции.

Кроме того, если вы дополнительно реализуете INotifyPropertyChanged для T, BindingList<T> автоматически подписывается на изменения свойств для каждого T в коллекции и дает представление о значении об изменении.

Ответ 2

Попробуйте использовать BindingList < > вместо List < > и (как уже было предложено Daniel), реализуйте INotifyPropertyChanged. Однако, я думаю, вы также можете вызвать .Refesh(), если вы не хотите реализовывать интерфейс INotifyPropertyChanged.

Вот пример, сорванный из здесь

public class Car : INotifyPropertyChanged
 {
   private string _make;
   private string _model;
   private int _year;

  public event PropertyChangedEventHandler PropertyChanged;

  public Car(string make, string model, int year)
   {
     _make = make;
     _model = model;
     _year = year;
   }

  public string Make
   {
     get { return _make; }
     set
     {
       _make = value;
       this.NotifyPropertyChanged("Make");
     }
   }

  public string Model
   {
     get { return _model; }
     set
     {
       _model = value;
       this.NotifyPropertyChanged("Model");
     }
   }

  public int Year
   {
     get { return _year; }
     set
     {
       _year = value;
       this.NotifyPropertyChanged("Year");
     }
   }

  private void NotifyPropertyChanged(string name)
   {
     if(PropertyChanged != null)
       PropertyChanged(this, new PropertyChangedEventArgs(name));
   }
 }

_dgCars.AutoGenerateColumns = false;

DataGridViewTextBoxColumn makeColumn = new DataGridViewTextBoxColumn();
 makeColumn.DataPropertyName = "Make";
 makeColumn.HeaderText = "The Car Make";

DataGridViewTextBoxColumn modelColumn = new DataGridViewTextBoxColumn();
 modelColumn.DataPropertyName = "Model";
 modelColumn.HeaderText = "The Car Model";

DataGridViewTextBoxColumn yearColumn = new DataGridViewTextBoxColumn();
 yearColumn.DataPropertyName = "Year";
 yearColumn.HeaderText = "The Car Year";

_dgCars.Columns.Add(makeColumn);
 _dgCars.Columns.Add(modelColumn);
 _dgCars.Columns.Add(yearColumn);

BindingList<Car> cars = new BindingList<Car>();

cars.Add(new Car("Ford", "Mustang", 1967));
 cars.Add(new Car("Shelby AC", "Cobra", 1965));
 cars.Add(new Car("Chevrolet", "Corvette Sting Ray", 1965));

_dgCars.DataSource = cars;

Ответ 3

Вам необходимо реализовать интерфейс INotifyPropertyChanged для объекта, который хранит данные. Каждое свойство должно поднять это событие во время заданного вызова свойства, если значение изменилось. Затем сетка автоматически получит обновление.