2012-02-10 8 views
4

C# 형식의 열 10 개가있는 datagridview 인 dgv1은 DB 테이블로 묶여 있습니다. 두 번째 열은 닫음/열림/고려 사항의 값이있는 콤보 상자입니다. 사용자는 모든 셀의 혈관을 수정할 수 있습니다. 수정이 끝나면 저장 버튼을 눌러 DB 테이블의 변경 사항을 저장할 수 있습니다. 변경 사항을 저장하기 전에 다른 작업을 수행해야합니다. 두 번째 열의 값이 변경되면 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은 훌륭한 제안을했습니다. 또 다른 방법은 DB와 관련하여 Delta라는 용어에 익숙한 사람이라면 인라인 델타와 같은 HashTable 일종의 값을 저장하는 것입니다. 이것이 오라클이라면 완전히 쉽습니다. Old and : 당신이 얻을 수있는 새로운 .. 이제는 그것에 대해 생각해 보겠습니다. On RoW Click 이벤트에 현재 값을 캡처하지 않는 이유는 무엇입니까? 그것은 그것뿐만 아니라 그것을 캡처 변경하고 재산에 그들을 저장할 비교 .. – 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()); 
} 

ComboBox이 다음 중 어떤 것을 사용하여 변경되었는지 확인할 수 있습니다.

// 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. 
    } 
} 

희망이 있습니다.

+0

당신의 제안에 감사드립니다! 나는 Killercam의 제안을 먼저 시도 할 것이다. 다시 한 번 감사드립니다! –

0

CellBeginEdit 및 CellEndEdit 이벤트에 가입하고 변경 사항이있을 경우 사전에 결과를 추가하면 최종 결과는 셀을 키로 포함하는 사전을 반복하기 만하면됩니다. case 객체의 combobox 값)을 편집하기 전에 이전 값으로 설정합니다.

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); 
      } 
     } 
    } 
관련 문제