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();
}