2011-10-10 31 views
5

DataSourceをmyBindingListに設定してdatagridviewを取得しました。 リストの項目はINotifyPropertyChangedを実装しているので、datagridviewは自動的にリストの変更に応答します。DataGridView&BindingList:セルの値が変更されたかどうかを確認する方法?

今、私はdatagridviewの列のいくつかの要約を計算する必要があります。

それが行われる必要があります:

  • データソースの変更(OnDataSourceChanged)
  • セル値の変更(OnCellValueChanged)

まず1がクリアされているが、私は小さな問題を持っています2番目のもの。

myDataGridView.Rows[x].Cells[y].Value=newValue; 

が、何について:自動的

myBindingList[myInvoice].Property1=newValue; 

DataGridViewのリフレッシュ(INotifyPropertyChangedの)それはイベントをOnCellValueChanged発生しません、ユーザーがコントロールするか、上のセルの値を変更したときに火災をOnCellValueChanged

DataGridViewからこのような情報を取得するにはどうすればよいですか? 私はdgvを拡張する独自のコントロールを作成しているので、DataGridViewレベルで行う必要があります。

ありがとうございます。

答えて

0

これを解決するには、BindingSourceをデータソースとして使用し、カスタムDataGridView内でBindingSource ListChangedイベントへの応答として独自のイベントを発生させることが最も近いと思います。

私はおそらく、このようなOnDataSourceChanged何かを上書きしたい:

public event EventHandler CustomCellValueChanged; 

protected override void OnDataSourceChanged(EventArgs e) 
{ 
    bs = this.DataSource as BindingSource; 

    if (bs == null) 
    { 
     throw new ArgumentException("DataSource must be a BindingSource"); 
    } 

    bs.ListChanged += new System.ComponentModel.ListChangedEventHandler(bs_ListChanged); 

    base.OnDataSourceChanged(e); 
} 

void bs_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e) 
{    
    if (CustomCellValueChanged != null) 
    {    
     CustomCellValueChanged(this, new EventArgs()); 
    } 
} 

これで問題はない方法は、(私は考えることはできません)あなたはすべて再評価しなければならないので、正しいセルのプロパティを取得することがあるということです変更が含まれている列だけでなく列も変更できます。

関連する問題