2012-03-18 45 views
14

Tôi có một danh sách các đối tượngC# DataGridView không cập nhật khi nguồn dữ liệu được thay đổi

List<MobilePhone> results; 

vì vậy tôi thêm vào danh sách cho datagridview

dataGridView.DataSource = phase3Results; 

vì vậy tôi có một vài hộp thả xuống mà dictate danh sách kết quả ở bất kỳ thay đổi nào của mục đã chọn trong các hộp thả xuống, vì vậy kết quả danh sách của tôi thay đổi, nhưng trên datagridview nó không được phản ánh. có cách nào để "làm mới" các thay đổi không?

Trả lời

32

Nhanh chóng và bẩn giải pháp:

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

sạch và đúng giải pháp:

Sử dụng một BindingList<T> thay vì List<T> như DataSource của bạn. List<T> không kích hoạt sự kiện khi bộ sưu tập của nó thay đổi.

Ngoài ra, nếu bạn bổ sung thêm INotifyPropertyChanged cho T, BindingList<T> tự động đăng ký thay đổi thuộc tính cho mỗi T trong bộ sưu tập và cho phép chế độ xem biết về thay đổi.

+1

Trong khi điều này có thể hoạt động, nó sẽ phải vẽ lại toàn bộ lưới điện, gây tổn thương thực hiện nếu bạn có rất nhiều hàng/cột. –

+0

Không phải là mục tiêu để repopulate lưới điện bởi vì tập hợp kết quả đã thay đổi? – Kevin

+0

Điều này có thể đạt được khi DataGridView được liên kết với DataPropertyName của một lớp không? nếu vậy làm thế nào nó có thể đạt được? –

2

Bạn cần triển khai giao diện INotifyPropertyChanged trên đối tượng đang lưu trữ dữ liệu. Mỗi thuộc tính cần tăng sự kiện đó trong suốt cuộc gọi được thiết lập của thuộc tính nếu giá trị thay đổi. Sau đó, lưới sẽ tự động nhận được bản cập nhật.

12

Thử sử dụng BindingList <> thay vì Danh sách <> và (như đã được đề xuất bởi Daniel), triển khai INotifyPropertyChanged. Tuy nhiên, tôi nghĩ bạn cũng có thể gọi .Refesh() nếu bạn không muốn triển khai giao diện INotifyPropertyChanged.

Dưới đây là một ví dụ tách từ 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() sẽ chỉ vẽ lại khu vực khách hàng (sơn) và sẽ không phục hồi dữ liệu. –

Các vấn đề liên quan