2011-12-22 27 views
2

私はこれをGoogleにしようとしていますが、私に適した解決策を見つけることができませんでした。DataGridで行が編集されたときを検出します。

私は、クライアントが知らないSQLテーブルからいくつかの情報を表示しているDataGridを持っています。 クライアントはサーバーに要求を送信し、リスト<SomeClass>を応答として取得し、それをDataGridに表示します。

ユーザーが行を変更したときに、ユーザーが入力した新しい値が必要な場合を検出する必要があります。 現在、RowEditEndingイベントを使用しています。そして、このイベントを処理するメソッドは、することができます:

private void editRowEventHandler(object sender, DataGridRowEditEndingEventArgs e) 
{ 
    SomeClass sClass = e.Row.DataContext as SomeClass; 
    // Send sClass to the server to be saved in the database... 
} 

これは私に編集された行を示します。しかし、それは私に変更前の行を与え、変更が起こった後に行を取得する方法を理解することができません。

私はこれをやり遂げる方法を知っている人がいますか、私が見つけることができる方向に私を向けることができますか?

+0

なぜSomeClassのセットでそれをキャッチしないのですか? – Paparazzi

答えて

1

あなたの場合、オブジェクトの変更を検出しようとしています。これは、ダウン工assの性質に来て、このようにあなたの代わりに「行」の「セル」に焦点を当てる必要があります

あなたのデータグリッドがresultGridであると仮定すると、私は以下のコードを思い付く:

resultGrid.CellEditEnding += resultGrid_CellEditEnding; 
void resultGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 
     { 
      var yourClassInstance = e.EditingElement.DataContext; 
      var editingTextBox = e.EditingElement as TextBox; 
      var newValue = editingTextBox.Text; 
     } 

"e"には、セルの行と列に関する情報も含まれています。したがって、セルが使用しているエディタがわかります。この場合、私はそれがテキストボックスであると仮定します。 希望します。

+0

新しい値で1行だけで行を取得できることを期待していました。なぜなら、20のメンバ変数を持つクラスがあるからです。だから私は、私が働いている列を見て、正しいメンバー変数に値を割り当てるスイッチを書く必要があると思います。 これは、書いたかったよりも多くのコードですが、問題は解決します。ありがとうございます。 :) – Laleila

3

セル単位での読み出しを避けるため、hereの説明を参照してください。

private void OnRowEditEnding(object sender, DataGridRowEditEndingEventArgs e) 
{ 
    DataGrid dataGrid = sender as DataGrid; 
    if (e.EditAction == DataGridEditAction.Commit) { 
     ListCollectionView view = CollectionViewSource.GetDefaultView(dataGrid.ItemsSource) as ListCollectionView; 
     if (view.IsAddingNew || view.IsEditingItem) { 
      this.Dispatcher.BeginInvoke(new DispatcherOperationCallback(param => 
      { 
       // This callback will be called after the CollectionView 
       // has pushed the changes back to the DataGrid.ItemSource. 

       // Write code here to save the data to the database. 
       return null; 
      }), DispatcherPriority.Background, new object[] { null }); 
     } 
    } 
} 
関連する問題