2012-02-10 44 views
4

私はdatagridview、C#フォームで10列のdgv1を持っています、それはDBテーブルで囲まれています。 2番目の列は、close/open /の値を持つコンボボックスです。ユーザーは任意のセルの血管を修正することができます。変更が完了したら、Saveボタンを押してDBテーブルへの変更を保存することができます。 変更を保存する前に別のタスクを実行する必要があります.2番目の列の値が変更された場合は、DBストアドプロシージャを呼び出す必要があります。C#でdatagridviewのセル状態を取得する方法

私の問題は、セルの値が変更されたかどうかを知る方法がわからず、以前の値を知る必要があります。以前の値はストアドプロシージャに渡す必要があります。&

foreach (DataRow rows in dtList.Rows) 
{ 
    if(rows.RowState.ToString() == "Modified") 
    { 
     if(rows.cell(1) is changed) 
     { 
     call stored procedure here... 
     } 
    } 
    i++; 
} 
+0

WinForms、WPFなど?フォーム(WinFormsを前提とする)が初期化/ロードされるときに 'DataGridView'のデータを' DataTable'に格納することができます。次に、「保存」ボタンが押されたときに(バインドされた 'DataTable'に対して)変更をチェックします。 – MoonKnight

+0

KillerCamには素晴らしい提案があります。別の方法は、データベースに関してデルタという用語に精通している場合、Inline DeltaのようなHashTableソートに値を格納することです。これがOracleの場合は、 Old Roew ClickイベントのCurrent Valueをキャプチャしないでください。現在の状態をキャプチャしています。それもそれをキャプチャ変更し、プロパティでそれらを格納する比較.. – MethodMan

答えて

0

一つの簡単な(!おそらくない最良の方法は)でComboBox値を格納するためにListを用いることであろう形の負荷では、我々は書くことができます。私たちの保存に続い

const int yourCell = 1; 
List<string> colComboValues = new List<string>(); 
foreach (DataGridViewRow dgvRow in this.dataGridView.Rows) 
{ 
    DataGridViewComboBoxCell CB = dgvRow.Cells[yourCell] as DataGridViewComboBoxCell; 
    colComboValues.Add(CB.Value.ToString()); 
} 

をし、

// On Save. 
int nIdx = 0; 
foreach (DataGridViewRow dgvRow in this.dataGridView.Rows) 
{ 
    DataGridViewComboBoxCell CB = dgvRow.Cells[yourCell] as DataGridViewComboBoxCell; 
    if (String.Compare(CB.Value.ToString(), colComboValues[nIdx++], false) != 0) 
    { 
     // Value has changed! 
    } 
    else 
    { 
     // Value has not. 
    } 
} 

これが役立つことをご確認ください。ComboBox

+0

あなたの提案をいただきありがとうございます!私はKillercamの提案をまず試してみるつもりです。再度、感謝します! –

0

CellBeginEditイベントとCellEndEditイベントを購読して、変更があった場合に結果を辞書に追加すると、結果として、そのセルをキーとして含む辞書を反復処理するだけですあなたのケースのコンボボックス値の大文字小文字のオブジェクト)を編集前に前の値に戻します。

Dictionary<DataGridViewCell, object> cvDict = new Dictionary<DataGridViewCell, object>(); 

    private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) 
    { 
     DataGridViewCell dgcv = (sender as DataGridView).Rows[e.RowIndex].Cells[e.ColumnIndex]; 
     if (!cvDict.ContainsKey(dgcv)) 
     { 
      cvDict.Add(dgcv, dgcv.Value); 
     } 
    } 

    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
    { 
     DataGridViewCell dgcv = (sender as DataGridView).Rows[e.RowIndex].Cells[e.ColumnIndex]; 
     if (cvDict.ContainsKey(dgcv)) 
     { 
      if (cvDict[dgcv].Equals(dgcv.Value)) 
      { 
       cvDict.Remove(dgcv); 
      } 
     } 
    } 
関連する問題