数据源更改时,C#DataGridView未更新

本文关键字:C#DataGridView 更新 数据源 | 更新日期: 2023-09-27 18:28:06

我有一个对象的列表

List<MobilePhone> results;

所以我把这个列表添加到datagridview

dataGridView.DataSource = phase3Results;

因此,我有几个下拉框,它们规定了下拉框中所选项目的任何更改时的列表结果,因此我的列表结果会更改,但在datagridview上它没有反映出来。有什么方法可以"刷新"更改吗?

数据源更改时,C#DataGridView未更新

快速且肮脏的解决方案

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

清洁正确的解决方案

使用BindingList<T>而不是List<T>作为数据源。List<T>在其集合更改时不会激发事件。

此外,如果为T额外实现INotifyPropertyChanged,则BindingList<T>会自动为集合中的每个T订阅属性更改,并让视图了解有关更改的信息。

尝试使用BindingList<>而不是List<>以及(正如Daniel已经建议的),实现INotifyPropertyChanged。但是,如果您不想实现INotifyPropertyChanged接口,我认为您也可以调用.Refesh()。

这里有一个从这里撕下来的例子

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;

您需要在存储数据的对象上实现INotifyPropertyChanged接口。如果值发生更改,则每个属性都需要在属性的set调用期间引发该事件。然后网格将自动获得更新。

一个简单的方法是使用新的BindingSource(object dataSource,")

这将更新绑定源,从而更新表

例如:

dataGridView.DataSource = new BindingSource(phase3Results, "");

根据Chris Gessler和Daniel的建议,您必须使用BindingList<gt而不是List<gt;,并且您的模型应该正确地实现INotifyPropertyChanged。但更重要的是,检查模型是否实际上是一个类。当模型为Records或Struct时,Datagridview将放弃更改。