BindingList(C#Windowsフォーム)にバインドされたDataGridViewがあります。リスト内のアイテムの値の1つを変更しても、グリッドにすぐには表示されません。変更されたセルをクリックするか最小化してからウィンドウを最大化すると、正しく更新されますが、自動的に実行する必要があります。
以前にも同じ問題がありましたが、その状況では、値が変更されると同時にセルの背景色を変更する必要がありました。これにより、セルが正しく更新されました。
それを機能させる唯一の方法は...
dataGridView.DataSource = null;
dataGridView.DataSource = myBindingList
...しかし、スクロールバーが一番上に表示され、セルの背景色を再度設定する必要があることを意味するので、これは避けたいです。確かにもっと良い方法があります。更新(および親の更新)、更新、および無効化を試しましたが、それらは私が必要としていることを実行していません。
いくつかの掲示板でこの問題が言及されているのを見たことがありますが、まだ有効な答えは見ていません。
アイテム値の変更に関する
ListChanged
通知は、リストアイテムタイプがINotifyPropertyChanged
インターフェースを実装している場合にのみ発生します。
取得元: http://msdn.Microsoft.com/en-us/library/ms132742.aspx
だから私の最初の質問は次のようになります:あなたのアイテムを実装します INotifyPropertyChanged
正しく?
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;
データが変更されるたびにmyBindingList.ResetBindings()
を呼び出すだけです!
オブジェクトの変更通知が正しくトリガー/処理されないために鳴ります。私は個人的に、dataGridViewにバインドするときは常にBindingSourceオブジェクトを使用します。
DataGridView FAQ と DataBinding FAQ を確認して、オブジェクト変更通知を検索します。
ADO.Netを使用している場合は、.Validate()メソッドと.EndEdit()メソッドの呼び出しを忘れないでください。
private void refreshDataGrid()
{
dataGridView1.DataSource = typeof(List<>);
dataGridView1.DataSource = myBindingList;
dataGridView1.AutoResizeColumns();
dataGridView1.Refresh();
}
次に、リストに変更が発生するたびに、refreshDataGridメソッドを呼び出すだけです。