【发布时间】:2012-03-18 13:09:32
【问题描述】:
我有一个对象列表
List<MobilePhone> results;
所以我将列表添加到 datagridview
dataGridView.DataSource = phase3Results;
所以我有几个下拉框,它们指示下拉框中所选项目的任何更改时的列表结果,所以我的列表结果发生了变化,但在 datagridview 上它没有反映。有没有办法“刷新”更改?
【问题讨论】:
我有一个对象列表
List<MobilePhone> results;
所以我将列表添加到 datagridview
dataGridView.DataSource = phase3Results;
所以我有几个下拉框,它们指示下拉框中所选项目的任何更改时的列表结果,所以我的列表结果发生了变化,但在 datagridview 上它没有反映。有没有办法“刷新”更改?
【问题讨论】:
快速而肮脏的解决方案:
dataGridView.DataSource = null;
dataGridView.DataSource = phase3Results;
干净正确的解决方案:
使用BindingList<T> 而不是List<T> 作为您的数据源。 List<T> 在其集合更改时不会触发事件。
另外,如果您另外为T 实现INotifyPropertyChanged,BindingList<T> 会自动订阅集合中每个T 的属性更改,并让视图知道更改。
【讨论】:
尝试使用 BindingList 而不是 List 并且(正如 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;
【讨论】:
您需要在存储数据的对象上实现 INotifyPropertyChanged 接口。如果值发生更改,每个属性都需要在属性的 set 调用期间引发该事件。然后网格会自动获取更新。
【讨论】:
一种简单的方法是使用 new BindingSource(object dataSource, "")
这将更新绑定源,从而更新表
例如:
dataGridView.DataSource = new BindingSource(phase3Results, "");
【讨论】: