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

我有一个对象列表

List results; 

所以我将列表添加到datagridview

 dataGridView.DataSource = phase3Results; 

所以我有一些下拉框,在下拉框中选中项目的任何更改时决定列表结果,所以我的列表结果发生了变化,但是在datagridview上没有反映出来。 有没有办法“刷新”变化?

快速又脏的解决方案

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

清洁正确的解决方案

使用BindingList而不是List作为您的DataSource。 List在其集合更改时不会触发事件。

此外,如果您另外为T实现INotifyPropertyChangedBindingList自动订阅集合中每个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 cars = new BindingList(); 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 set期间引发该事件。 然后网格将自动获得更新。