web-dev-qa-db-ja.com

BindingListにバインドされたDataGridViewは、値が変更されても更新されません

BindingList(C#Windowsフォーム)にバインドされたDataGridViewがあります。リスト内のアイテムの値の1つを変更しても、グリッドにすぐには表示されません。変更されたセルをクリックするか最小化してからウィンドウを最大化すると、正しく更新されますが、自動的に実行する必要があります。

以前にも同じ問題がありましたが、その状況では、値が変更されると同時にセルの背景色を変更する必要がありました。これにより、セルが正しく更新されました。

それを機能させる唯一の方法は...

dataGridView.DataSource = null;  
dataGridView.DataSource = myBindingList

...しかし、スクロールバーが一番上に表示され、セルの背景色を再度設定する必要があることを意味するので、これは避けたいです。確かにもっと良い方法があります。更新(および親の更新)、更新、および無効化を試しましたが、それらは私が必要としていることを実行していません。

いくつかの掲示板でこの問題が言及されているのを見たことがありますが、まだ有効な答えは見ていません。

18
C Walker

アイテム値の変更に関するListChanged通知は、リストアイテムタイプがINotifyPropertyChangedインターフェースを実装している場合にのみ発生します。

取得元: http://msdn.Microsoft.com/en-us/library/ms132742.aspx

だから私の最初の質問は次のようになります:あなたのアイテムを実装します INotifyPropertyChanged 正しく?

23
Oliver

BindingListの変更がdatagridviewに反映されるように、データソースはINotifyPropertyChangedを実装する必要があります。

class Books : INotifyPropertyChanged
{
   private int m_id;
   private string m_author;
   private string m_title;

   public int ID { get { return m_id; } set { m_id = value; NotifyPropertyChanged("ID"); } }
   public string Author { get { return m_author; } set { m_author = value; NotifyPropertyChanged("Author"); } }
   public string Title { get { return m_title; } set { m_title = value; NotifyPropertyChanged("Title"); } }


   public event PropertyChangedEventHandler PropertyChanged;

   private void NotifyPropertyChanged(string p)
   {
       if (PropertyChanged != null)
           PropertyChanged(this, new PropertyChangedEventArgs(p));
   }
}

BindingList<Books> books= new BindingList<Books>();

datagridView.DataSource = books;
5
Shekhar

データが変更されるたびにmyBindingList.ResetBindings()を呼び出すだけです!

3
Caverna

オブジェクトの変更通知が正しくトリガー/処理されないために鳴ります。私は個人的に、dataGridViewにバインドするときは常にBindingSourceオブジェクトを使用します。

DataGridView FAQDataBinding FAQ を確認して、オブジェクト変更通知を検索します。

ADO.Netを使用している場合は、.Validate()メソッドと.EndEdit()メソッドの呼び出しを忘れないでください。

1
dampee
    private void refreshDataGrid()
    {
        dataGridView1.DataSource = typeof(List<>);
        dataGridView1.DataSource = myBindingList;
        dataGridView1.AutoResizeColumns();
        dataGridView1.Refresh();
    }

次に、リストに変更が発生するたびに、refreshDataGridメソッドを呼び出すだけです。

0
John Bartels