Я думаю, что причина, по которой код OPs не работает, состоит в том, что, как только вы вызываете Remove, вы меняете длину drr.Когда вы вызываете Delete, вы фактически не удаляете строку, пока не будет вызван AcceptChanges.Вот почему, если вы хотите использовать Remove, вам нужен отдельный цикл.
В зависимости от ситуации или предпочтений ...
string colName = "colName";
string comparisonValue = (whatever it is).ToString();
string strFilter = (dtbl.Columns[colName].DataType == typeof(string)) ? "[" + colName + "]='" + comparisonValue + "'" : "[" + colName + "]=" + comparisonValue;
string strSort = "";
DataRow[] drows = dtbl.Select(strFilter, strSort, DataViewRowState.CurrentRows);
Выше использовалось для следующих двух примеров
foreach(DataRow drow in drows)
{
drow.Delete();//Mark a row for deletion.
}
dtbl.AcceptChanges();
ИЛИ
foreach(DataRow drow in drows)
{
dtbl.Rows[dtbl.Rows.IndexOf(drow)].Delete();//Mark a row for deletion.
}
dtbl.AcceptChanges();
ИЛИ
List<DataRow> listRowsToDelete = new List<DataRow>();
foreach(DataRow drow in dtbl.Rows)
{
if(condition to delete)
{
listRowsToDelete.Add(drow);
}
}
foreach(DataRow drowToDelete in listRowsToDelete)
{
dtbl.Rows.Remove(drowToDelete);// Calling Remove is the same as calling Delete and then calling AcceptChanges
}
Обратите внимание, что если вы вызываете Delete (), то вы должны вызывать AcceptChanges (), но если вы вызываете Remove (), то AcceptChanges ()не требуется.
Также здесь есть хорошая ссылка на синтаксис фильтра строк.