С# DataGridView не обновляется при изменении источника данных
У меня есть список объектов
List<MobilePhone> results;
поэтому я добавил список в datagridview
dataGridView.DataSource = phase3Results;
поэтому у меня есть несколько раскрывающихся ящиков, которые диктуют результаты списка при любом изменении выбранного элемента в раскрывающихся списках, поэтому мои результаты списка меняются, но на datagridview его не отражено. есть ли способ "обновить" изменения?
Ответы
Ответ 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 для объекта, который хранит данные. Каждое свойство должно поднять это событие во время заданного вызова свойства, если значение изменилось. Затем сетка автоматически получит обновление.