본문 바로가기

Development/C#

C# DataTable Foreach로 DataRow 삭제하기

foreach(DataRow dr IN dtData.Rows)
{
      if(dr["name"].ToSting() == "smith")
            dr.Remove();
}

 

개발을 하다보면 위와같이 처리해야 하는 경우가 종종 발생한다.

그럼 컴파일시 아래와 같은 오류가 발생한다.

컬렉션이 수정되었습니다. 열거 작업이 실행되지 않을 수 있습니다.

 

컬렉션이 수정되었습니다. 열거 작업이 실행되지 않을 수 있습니다.

현재 사용중인 Collection에 직접 삭제작업이 안되므로 다른 방법으로 삭제해야 한다.

 

처리방법

foreach(DataRow dr IN dtData.Select())
{
      if(dr["name"].ToSting() == "smith")
            dr.Delete();
}
dtData.AcceptChanges();

 

1. foreach(DataRow dr IN dtData.Select())

  - 먼저 dtData.Rows가 아닌 Select()로 DataRow Collection을 가져온다.

 

2. dr.Delete();

  - Remove()가 아닌 Delete() 함수로 삭제하여 당장 Row를 삭제처리하지 않고 RowState = Deleted로 상태만 변경한다.

 

3. dtData.AcceptChanges();

  - AcceptChanges 함수로 DataRowState 상태가 변경된 Row들을 적용시킨다.

 

DataRowState 상태 종류

* DataRowState 상태 종류

 - Unchanged : 변경 없음

 - Added : 새로운 Row로 추가됨

 - Detached : 새로운 Row로 추가되었으나 삭제됨

 - Modified : 기존 Row의 내용이 수정됨

 - Deleted : 기존 Row가 삭제됨