Удаление строки из datatable в C # - PullRequest
9 голосов
/ 17 июня 2011

У меня проблема с удалением строк из таблицы данных.В моей программе я читаю информацию из базы данных в таблицу данных с использованием SQL-запроса.Для этого я использую соединение oledb и код dt.Load(command.ExecuteReader());.Позже я хочу удалить строки, которые соответствуют строке идентификатора.Я попробовал следующий код купить не может заставить его работать:

            DataRow[] drr = dt.Select("Student=' " + id + " ' "); 
            for (int i = 0; i < drr.Length; i++)
                dt.Rows.Remove(drr[i]);
            dt.AcceptChanges();

Может кто-нибудь, пожалуйста, предложить другой способ с примером?

Ответы [ 8 ]

17 голосов
/ 17 июня 2011

Попробуйте использовать Удалить метод:

    DataRow[] drr = dt.Select("Student=' " + id + " ' "); 
    for (int i = 0; i < drr.Length; i++)
        drr[i].Delete();
    dt.AcceptChanges();
3 голосов
/ 17 июня 2011

Есть несколько разных способов сделать это. Но Вы можете использовать следующий подход:

List<DataRow> RowsToDelete = new List<DataRow>();

for (int i = 0; i < drr.Length; i++) 
{     
   if(condition to delete the row) 
   {  
       RowsToDelete.Add(drr[i]);     
   } 
}

foreach(var dr in RowsToDelete) 
{     
   drr.Rows.Remove(dr); 
} 
2 голосов
/ 17 июня 2011

Этот вопрос поможет вам понять, как удалить запись из таблицы данных:

DataTable, Как условно удалить строки

Это будет выглядеть так:

DataRow[] drr = dt.Select("Student=' " + id + " ' "); 
foreach (var row in drr)
   row.Delete();

Не забывайте, что если вы хотите обновить базу данных, вам нужно будет вызвать команду «Обновить». Для получения дополнительной информации об этом, смотрите эту ссылку:

http://www.codeguru.com/forum/showthread.php?t=471027

0 голосов
/ 23 августа 2018

Advance for loop лучше подходит для этого случая

public void deleteRow(DataRow selectedRow)
        {
            foreach (DataRow  in StudentTable.Rows)
            {
                if (SR[TableColumn.StudentID.ToString()].ToString() == StudentIndex)
                    SR.Delete();
            }

            StudentTable.AcceptChanges();
        }
0 голосов
/ 29 июля 2015

Если вы хотите удалить всю строку из DataTable ,

попробуйте это

DataTable dt = new DataTable();  //User DataTable
DataRow[] rows;
rows = dt.Select("Student=' " + id + " ' ");
foreach (DataRow row in rows)
     dt.Rows.Remove(row);
0 голосов
/ 19 августа 2014

Я вижу несколько ответов, используя метод Remove, и другие, используя метод Delete.

Удалить (в соответствии с документами) немедленно удалит запись из (локальной) таблицы, а при обновлении не удалит отсутствующую запись.

Удалить в сравнении изменяет RowState на Deleted и обновляет таблицу серверов при обновлении.Аналогичным образом, вызов метода AcceptChanges до таблицы обновления сервера приведет к сбросу всех ваших RowState (ов) в состояние «Без изменений», и на сервер ничего не поступит.(Все еще кормлю большим пальцем после удара несколько раз).

0 голосов
/ 25 февраля 2014

Я думаю, что причина, по которой код 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 ()не требуется.

Также здесь есть хорошая ссылка на синтаксис фильтра строк.

0 голосов
/ 17 июня 2011

простой пример: http://www.dotnetspark.com/tutorial/13-42-delete-row-from-datatable.aspx

Это работает для вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...