更改数据源时,C#DataGridView未更新
我有一个对象列表
List results;
所以我将列表添加到datagridview
dataGridView.DataSource = phase3Results;
所以我有一些下拉框,在下拉框中选中项目的任何更改时决定列表结果,所以我的列表结果发生了变化,但是在datagridview上没有反映出来。 有没有办法“刷新”变化?
快速又脏的解决方案 :
dataGridView.DataSource = null; dataGridView.DataSource = phase3Results;
清洁正确的解决方案 :
使用BindingList
而不是List
作为您的DataSource。 List
在其集合更改时不会触发事件。
此外,如果您另外为T
实现INotifyPropertyChanged
, BindingList
自动订阅集合中每个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期间引发该事件。 然后网格将自动获得更新。