C#

[C#]DataTable RowState 강제로 변경

DevStory 2021. 8. 22.

C#에서 DataTable의 RowState를 강제로 변경해야하는 경우가 있습니다.

 

이번 포스팅은 DataTable의 RowState를 강제로 변경하는 방법을 정리합니다.

 


unchanged로 변경하기

AcceptChagned 메서드를 사용하여 DataTable의 모든 Row의 State를 Unchanged로 변경할 수 있습니다.

// 예제로 사용될 DataTable 생성
DataTable dt = new DataTable();

// 컬럼 생성
dt.Columns.Add("Market", typeof(string));
dt.Columns.Add("Fruit", typeof(string));
dt.Columns.Add("Price", typeof(int));
dt.Columns.Add("Count", typeof(int));

// 행 추가
dt.Rows.Add("Lotte", "Apple", 2000, 10);
dt.Rows.Add("Lotte", "Banana", 3000, 5);

dt.Rows.Add("Homeplus", "Apple", 1500, 50);
dt.Rows.Add("Homeplus", "Banana", 2500, 10);

// 추가된 Row의 State를 Unchanged로 변경
dt.AcceptChanges();

// Added
dt.Rows.Add("Emart", "Apple", 3000, 25);
dt.Rows.Add("Emart", "Banana", 2000, 5);

// Unchanged -> Modified
dt.Rows[0]["Price"] = 3000;
dt.Rows[1]["Price"] = 4000;

// Unchanged -> Deleted
dt.Rows[2].Delete();
dt.Rows[3].Delete();

Console.WriteLine("*****AcceptChanges 호출 전*****");
foreach (DataRow row in dt.Rows)
{
  Console.WriteLine(row.RowState);
}

실행 결과

0, 1번째 Row의 RowState는 값이 수정되었으므로 Modified 상태입니다.

2, 3번째 Row의 RowState는 delete 메서드에 의해 Deleted 상태입니다.

4, 5번째 Row의 RowState는 추가된 행이므로 Added 상태입니다.

 

DataTable의 Row를 순차적으로 순회하여 RowState를 출력한 결과입니다.

 

RowState를 Unchanged로 변경하기 위해 위 코드에서 dt.Rows[3].Delete(); 다음 dt.AcceptChanges();를 작성합니다.

//...

dt.AcceptChanges();

Console.WriteLine("\n*****AcceptChanges 호출 후*****");
foreach (DataRow row in dt.Rows)
{
  Console.WriteLine(row.RowState);
}

단, RowState가 Deleted인 행은 Unchanged로 변경되지 않고 완전히 제거됩니다.

모든 행이 Unchanged로 변경되었습니다.


Deleted로 변경하기

DataTable의 Row에 접근하여 delete 메서드를 호출하면, RowState를 Deleted로 변경합니다.

 

아래 코드는 DataTable의 모든 Row를 Deleted로 변경합니다.

// 예제로 사용될 DataTable 생성
DataTable dt = new DataTable();

// 컬럼 생성
dt.Columns.Add("Market", typeof(string));
dt.Columns.Add("Fruit", typeof(string));
dt.Columns.Add("Price", typeof(int));
dt.Columns.Add("Count", typeof(int));

// 행 추가
dt.Rows.Add("Lotte", "Apple", 2000, 10);
dt.Rows.Add("Lotte", "Banana", 3000, 5);

dt.Rows.Add("Homeplus", "Apple", 1500, 50);
dt.Rows.Add("Homeplus", "Banana", 2500, 10);

// 추가된 Row의 State를 Unchanged로 변경
dt.AcceptChanges();

foreach(DataRow row in dt.Rows)
{
  row.Delete();
}

Added로 변경하기

DataTable의 Row에 접근하여 SetAdded 메서드를 호출하면, RowState를 Added로 변경합니다.

 

아래 코드는 DataTable의 모든 Row를 Added로 변경합니다.

 

단, Unchanged 상태인 행만 SetAdded 메서드를 사용할 수 있습니다.

 

Unchanged 상태가 아닌 행에 SetAdded 메서드를 사용할 경우 예외가 발생합니다.

// 예제로 사용될 DataTable 생성
DataTable dt = new DataTable();

// 컬럼 생성
dt.Columns.Add("Market", typeof(string));
dt.Columns.Add("Fruit", typeof(string));
dt.Columns.Add("Price", typeof(int));
dt.Columns.Add("Count", typeof(int));

// 행 추가
dt.Rows.Add("Lotte", "Apple", 2000, 10);
dt.Rows.Add("Lotte", "Banana", 3000, 5);

dt.Rows.Add("Homeplus", "Apple", 1500, 50);
dt.Rows.Add("Homeplus", "Banana", 2500, 10);

// 추가된 Row의 State를 Unchanged로 변경
dt.AcceptChanges();

foreach(DataRow row in dt.Rows)
{
  row.SetAdded();
}

Modified로 변경하기

DataTable의 Row에 접근하여 SetModified 메서드를 호출하면, RowState를 Modified로 변경합니다.

 

아래 코드는 DataTable의 모든 Row를 Modified로 변경합니다.

 

단, Unchanged 상태인 행만 SetModified 메서드를 사용할 수 있습니다.

 

Unchanged 상태가 아닌 행에 SetModified 메서드를 사용할 경우 예외가 발생합니다.

// 예제로 사용될 DataTable 생성
DataTable dt = new DataTable();

// 컬럼 생성
dt.Columns.Add("Market", typeof(string));
dt.Columns.Add("Fruit", typeof(string));
dt.Columns.Add("Price", typeof(int));
dt.Columns.Add("Count", typeof(int));

// 행 추가
dt.Rows.Add("Lotte", "Apple", 2000, 10);
dt.Rows.Add("Lotte", "Banana", 3000, 5);

dt.Rows.Add("Homeplus", "Apple", 1500, 50);
dt.Rows.Add("Homeplus", "Banana", 2500, 10);

// 추가된 Row의 State를 Unchanged로 변경
dt.AcceptChanges();

foreach(DataRow row in dt.Rows)
{
  row.SetModified();
}
반응형

댓글