【问题标题】:C# DataGridView not updated when datasource is changed更改数据源时未更新 C# DataGridView
【发布时间】:2012-03-18 13:09:32
【问题描述】:

我有一个对象列表

List<MobilePhone> results;

所以我将列表添加到 datagridview

dataGridView.DataSource = phase3Results;

所以我有几个下拉框,它们指示下拉框中所选项目的任何更改时的列表结果,所以我的列表结果发生了变化,但在 datagridview 上它没有反映。有没有办法“刷新”更改?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    快速而肮脏的解决方案

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

    干净正确的解决方案

    使用BindingList&lt;T&gt; 而不是List&lt;T&gt; 作为您的数据源。 List&lt;T&gt; 在其集合更改时不会触发事件。

    另外,如果您另外为T 实现INotifyPropertyChangedBindingList&lt;T&gt; 会自动订阅集合中每个T 的属性更改,并让视图知道更改。

    【讨论】:

    • 虽然这可能有效,但它必须重新绘制整个网格,如果您有很多行/列,则会影响性能。
    • 目标不是因为结果集发生了变化而重新填充网格吗?
    • DataGridView绑定到一个类的DataPropertyName可以实现吗?如果可以,如何实现?
    【解决方案2】:

    尝试使用 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;
    

    【讨论】:

    • .Refresh() 只会重绘客户区(paint),不会重新绑定数据。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      一种简单的方法是使用 new BindingSource(object dataSource, "")

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

      例如:

      dataGridView.DataSource = new BindingSource(phase3Results, "");

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-27
        • 2021-05-06
        • 2013-08-30
        • 2019-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-20
        相关资源
        最近更新 更多