c#/vb.net DataGridView 추가된행/삭제된행/수정된행만 접근하기
2019. 9. 11. 13:24ㆍC#
728x90
반응형
DataGridView를 작업 하다보면 필요한 작업이
삭제 된 건만 따로 접근하고,
수정 된 건만 따로 접근하고,
추가 된 건만 따로 접근해야 할 때가 생깁니다.
이럴 때 방법을 공유 합니다.
① DataGridView에서 추가/수정/삭제 된 행을 따로 담습니다.
Datatable의 GetChanges 라는 메서드를 이용하여 삭제 된 행을 복사본으로 가져옵니다.
C#
DataTable dtDel = dt.GetChanges(DataRowState.Deleted);
DataTable dtAdd = dt.GetChanges(DataRowState.Added);
DataTable dtModi = dt.GetChanges(DataRowState.Modified);
VB.NET
Dim dtDel As DataTable = dt.GetChanges(DataRowState.Deleted)
Dim dtAdd As DataTable = dt.GetChanges(DataRowState.Added)
Dim dtModi As DataTable = dt.GetChanges(DataRowState.Modified)
DataTable.GetChanges Method (System.Data)
마지막으로 로드되거나 가 호출된 후에 변경된 내용이 모두 들어 있는 의 복사본을 가져옵니다.
② 삭제, 추가, 수정 여부를 파악하여 동작을 수행 합니다.
foreach 문으로 datarow를 반복하며 DataRowState의 값이 Deleted 인 것일 때
DataRowVersion.Original
즉 삭제되기 전 원래의 값을 변수에 담고 활용할 수 있습니다.
C#
if (dtDel != null)
{
foreach (DataRow dr in dtDel.Rows)
{
if (dr.RowState == DataRowState.Deleted)
{
// 삭제되기 전 값
var boforeValue = dr[0, DataRowVersion.Original];
// 여기에 Delete Query 를 써도 됨.
// 나 같은 경우는 id값을 가져와 삭제를 했음.
delCnt += 1;
}
}
}
VB.NET
If Not (dtDel Is Nothing) Then
For Each dr As DataRow In dtDel.Rows ' 삭제 된 행이라면?
If (dr.RowState = DataRowState.Deleted) Then
Dim beforeValue = Nothing
beforeValue = dr(0, DataRowVersion.Original) ' DELETE 구문
delcnt += 1
End If
Next
End if
DataRowVersion Enum (System.Data)
버전을 설명합니다.
③ 마지막으로 Datable.AcceptChanges() 를 써서 반영 한다.
dt.AcceptChanges() |
Datatable의 AcceptChanges() 는 테이블의 변동사항을 모두 커밋합니다.
<코드>
C#
VB.NET
' 각 각 상태에 따라 Datatable에 담음.
Dim dtDel As DataTable = dt.GetChanges(DataRowState.Deleted)
Dim dtAdd As DataTable = dt.GetChanges(DataRowState.Added)
Dim dtModi As DataTable = dt.GetChanges(DataRowState.Modified)
If Not (dtDel Is Nothing) Then
For Each dr As DataRow In dtDel.Rows
' 삭제 된 행이라면?
If (dr.RowState = DataRowState.Deleted) Then
Dim beforeValue As Object = Nothing
beforeValue = dr(0, DataRowVersion.Original)
' DELETE 구문
delcnt += 1
End If
Next
ElseIf Not (dtAdd Is Nothing) Then
For Each dr As DataRow In dtAdd.Rows
' 추가 된 행이라면?
If (dr.RowState = DataRowState.Added) Then
' insert 구문
addcnt += 1
End If
Next
ElseIf Not (dtModi Is Nothing) Then
For Each dr As DataRow In dtModi.Rows
' 수정 된 행이라면?
If (dr.RowState = DataRowState.Modified) Then
' update 구문
Dim sql_modi As String
modicnt += 1
End If
Next
End If
dt.AcceptChanges()
728x90
반응형
'C#' 카테고리의 다른 글
C#/VB.NET DataGridView CheckBox Column 만들기 (0) | 2019.12.25 |
---|---|
C#/VB.NET AsEnumerable은 DataTable의 멤버가 아닙니다. (0) | 2019.12.18 |
C# Selenium Span 값 읽기 (0) | 2019.06.14 |
C# Selenium 도전 2장 (1) | 2019.06.14 |
C# Selenium 도전 1장 (0) | 2019.06.14 |