[c#] DataTable에서 특정 행 삭제

DataTable에서 일부 행을 삭제하고 싶지만 다음과 같은 오류가 발생합니다.

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

이 코드를 삭제하는 데 사용합니다.

foreach(DataRow dr in dtPerson.Rows){
    if(dr["name"].ToString()=="Joe")
        dr.Delete();
}

그렇다면 문제는 무엇이며 어떻게 해결합니까? 어떤 방법을 권합니까?



답변

컬렉션에서 항목을 삭제하면 해당 컬렉션이 변경된 것이므로 계속 열거 할 수 없습니다.

대신 다음과 같은 For 루프를 사용하십시오.

for(int i = dtPerson.Rows.Count-1; i >= 0; i--)
{
    DataRow dr = dtPerson.Rows[i];
    if (dr["name"] == "Joe")
        dr.Delete();
}
dtPerson.AcceptChanges();

현재 인덱스를 삭제 한 후 행을 건너 뛰지 않도록 역순으로 반복합니다.


답변

모든 사람이 ‘ 열거 형에서 행을 삭제할 수 없습니다 ‘라는 유행에 뛰어 들기 전에 먼저 DataTables가 트랜잭션 적이라는 것을 인식하고 AcceptChanges () 를 호출 할 때까지 기술적으로 변경 사항을 제거하지 않아야합니다.

Delete 를 호출하는 동안이 예외가 표시되는 경우 이미 변경 보류중인 데이터 상태 입니다. 예를 들어, 데이터베이스에서 방금로드 한 경우, foreach 루프 내에있는 경우 Delete를 호출하면 예외가 발생합니다.

그러나! 그러나!

데이터베이스에서 행을로드하고 ‘ AcceptChanges () ‘ 함수를 호출하면 보류중인 모든 변경 사항을 DataTable에 커밋합니다. 이제 Delete ()를 호출하는 행 목록을 순회 할 수 있습니다. 단순히 행을 Deletion 용으로 표시하지만 AcceptChanges ()다시 호출 할 때까지 커밋되지 않기 때문입니다.

나는이 응답이 약간 오래된 것임을 알고 있지만 최근에 비슷한 문제를 다루어야했고 이것이 10 년 된 코드를 작업하는 미래의 개발자에게 약간의 고통을 덜어주기를 바랍니다. 🙂


추신 다음은 Jeff가 추가 한 간단한 코드 예제입니다 .

씨#

YourDataTable.AcceptChanges();
foreach (DataRow row in YourDataTable.Rows) {
    // If this row is offensive then
    row.Delete();
}
YourDataTable.AcceptChanges();

VB.Net

ds.Tables(0).AcceptChanges()
For Each row In ds.Tables(0).Rows
    ds.Tables(0).Rows(counter).Delete()
    counter += 1
Next
ds.Tables(0).AcceptChanges()


답변

이 솔루션으로 :

for(int i = dtPerson.Rows.Count-1; i >= 0; i--)
{
    DataRow dr = dtPerson.Rows[i];
    if (dr["name"] == "Joe")
        dr.Delete();
}

행을 삭제 한 후 데이터 테이블을 사용하려는 경우 오류가 발생합니다. 따라서 할 수있는 일은 다음 dr.Delete();과 같습니다.dtPerson.Rows.Remove(dr);


답변

이것은 나를 위해 작동합니다.

List<string> lstRemoveColumns = new List<string>() { "ColValue1", "ColVal2", "ColValue3", "ColValue4" };
List<DataRow> rowsToDelete = new List<DataRow>();

foreach (DataRow row in dt.Rows) {
    if (lstRemoveColumns.Contains(row["ColumnName"].ToString())) {
        rowsToDelete.Add(row);
    }
}

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

dt.AcceptChanges();


답변

DataRow[] dtr=dtPerson.select("name=Joe");
foreach(var drow in dtr)
{
   drow.delete();
}
dtperson.AcceptChanges();

도움이 되길 바랍니다


답변

DataTable 에서 전체 행 을 제거하려면 다음과 같이하십시오.

DataTable dt = new DataTable();  //User DataTable
DataRow[] rows;
rows = dt.Select("UserName = 'KarthiK'");  //'UserName' is ColumnName
foreach (DataRow row in rows)
     dt.Rows.Remove(row);


답변

또는 DataTable Row 컬렉션 을 목록으로 변환 하십시오.

foreach(DataRow dr in dtPerson.Rows.ToList())
{
    if(dr["name"].ToString()=="Joe")
    dr.Delete();
}