2012-03-18 74 views
14

我有對象的列表C#的DataGridView當數據源改變

List<MobilePhone> results; 

所以我說列表到DataGridView

dataGridView.DataSource = phase3Results; 

,所以我有這規定列表中的幾個下拉框未更新導致下拉框中所選項目發生任何變化,所以我的列表結果發生變化,但在datagridview中沒有反映出來。有什麼方法可以「刷新」更改嗎?

回答

32

快速和骯髒的解決方案

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

清潔和正確的解決

使用BindingList<T>,而不是爲List<T>您的數據源。 List<T>在收集更改時不會觸發事件。

另外,如果您還實現INotifyPropertyChangedTBindingList<T>自動訂閱集合中的每個T屬性更改,並讓視圖知道的變化。

+1

撕開雖然這可能是工作,就必須重新繪製整個網格,損害性能,如果你有很多行/列的例子。 – 2012-03-18 14:08:18

+0

因爲結果集已更改,是不是重新填充網格的目標? – Kevin 2013-01-25 16:36:42

+0

當DataGridView綁定到類的DataPropertyName時,可以實現這個功能嗎?如果是的話,如何實現? – 2017-12-22 19:34:32

2

您需要在存儲數據的對象上實現INotifyPropertyChanged接口。如果值發生更改,每個屬性都需要在設置的屬性調用期間引發該事件。然後網格會自動獲得更新。

12

嘗試使用綁定列表而不是列表<>和(如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; 
+0

.Refresh()將只重繪客戶區(繪畫)並且不會重新綁定數據。 – 2014-04-10 16:49:38

相關問題