C # DataGridView не обновляется при изменении источника данных - PullRequest
16 голосов
/ 18 марта 2012

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

List<MobilePhone> results;

поэтому я добавил список в таблицу данных

dataGridView.DataSource = phase3Results;

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

Ответы [ 3 ]

36 голосов
/ 18 марта 2012

Быстрый и грязный раствор :

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

Чистый и правильный раствор :

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

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

13 голосов
/ 18 марта 2012

Попробуйте использовать BindingList <> вместо List <> и (как уже было предложено Дэниелом) реализовать 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's Make";

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

DataGridViewTextBoxColumn yearColumn = new DataGridViewTextBoxColumn();
 yearColumn.DataPropertyName = "Year";
 yearColumn.HeaderText = "The Car's 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;
2 голосов
/ 18 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...