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

时间:2012-03-18 13:09:32

标签: c# winforms

我有一个对象列表

List<MobilePhone> results;

所以我将列表添加到datagridview

dataGridView.DataSource = phase3Results;

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

4 个答案:

答案 0 :(得分:36)

快速而肮脏的解决方案

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

清洁并纠正解决方案

使用BindingList<T>代替List<T>作为您的数据源。 List<T>在集合发生变化时不会触发事件。

此外,如果您为INotifyPropertyChanged另外实施TBindingList<T>会自动订阅集合中每个T的属性更改,并让视图了解更改。

答案 1 :(得分:13)

尝试使用BindingList&lt;&gt;而不是List&lt;&gt; (如Daniel已经建议的那样),实现INotifyPropertyChanged。但是,如果您不想实现INotifyPropertyChanged接口,我认为您也可以调用.Refesh()。

以下是从here

中删除的示例
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 :(得分:2)

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

答案 3 :(得分:0)

一种简单的方法是使用新的BindingSource(object dataSource,“”)

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

例如:

--archives src.zip#abc