Удалить строку из DataTable внутри DataSet - PullRequest
2 голосов
/ 31 августа 2011

У меня есть набор данных с несколькими таблицами данных внутри. Я отображаю DataTables в ListView (я не знал о привязке данных, когда писал код). В любом случае, я хотел бы удалить строки из DataTables внутри DataSet.

Я пробовал это:

foreach (DataRow row in dsData.Tables["Table1"].Rows)
  {
     //find the row that contains the username I'm after
     if (item.SubItems[2].Text == row["LoginName"].ToString())            
       {
         dsData.Tables["Table1"].Rows.Remove(row); //<- main code of interest
       }
  }

Я тоже пробовал

dsData.Tables["Table1".Rows.Delete(row);

Проблема, с которой я сталкиваюсь, заключается в том, что когда вы удаляете строку, я получаю исключение:

Коллекция была изменена; операция перечисления может не выполняться.

Из того, что я понимаю, это потому, что когда вы удаляете строку из ListView, строка под ней перемещается вверх и вызывает все эти проблемы. Сам код делает то, что должен, но не приятно видеть это исключение, когда вы его запускаете.

Я собирался переписать весь класс с помощью DataGridView, но, скорее всего, исправлю эту строку:).

РЕДАКТИРОВАТЬ: Я даже не уверен, что DataGridView все равно решит проблему.

Ответы [ 5 ]

4 голосов
/ 31 августа 2011

измените цикл на цикл для обратного отсчета, чтобы вы не получили это сообщение.

for(int i = dsData.Tables["TAble1"].Rows; i > 0; i--)
{
     if(item.SubItems[2].Text == dsData.Tables["Table1"].Rows[i - 1]["LoginName"].ToString())
         dsData.Tables["Table1"].Rows.Remove(i - 1)
}
1 голос
/ 31 августа 2011

Вам нужен обратный цикл, если вы собираетесь удалять вещи ( объяснение почему здесь )

for (int i = dsData.Tables["Table1"].Rows.Count - 1; i >= 0; i--)
{
    DataRow row = dsData.Tables["Table1"].Rows[i];

    //find the row that contains the username I'm after
    if (item.SubItems[2].Text == row["LoginName"].ToString())            
    {
        dsData.Tables["Table1"].Rows.Remove(row); //<- main code of interest
    }
}
1 голос
/ 31 августа 2011

Попробуйте:

        DataSet dsData = new DataSet();
        List<DataRow> rowsToDelete = new List<DataRow>();

        foreach (DataRow row in dsData.Tables["Table1"].Rows)
        {
            if (item.SubItems[2].Text == row["LoginName"].ToString())
            {
                rowsToDelete.Add(row);
            }
        }

        foreach(DataRow row in rowsToDelete)
        {
            dsData.Tables["Table1"].Rows.Remove(row); 
        }
0 голосов
/ 31 августа 2011

Вы не можете изменить коллекцию, которую вы повторяете, с помощью цикла foreach изнутри цикла.Сделайте это вместо:

for (int i = 0; i < dsData.Tables["Table1"].Rows.Count; i++)
  {
     DataRow row = dsData.Tables["Table1"].Rows[i];
     if (item.SubItems[2].Text == row["LoginName"].ToString())            
       {             
         dsData.Tables["Table1"].Rows.Remove(row); //<- main code of interest
       }
  }
0 голосов
/ 31 августа 2011

в общем, вы не можете удалить элементы из коллекции внутри цикла, который выполняет итерации, что вы можете сделать, это сохранить список всех строк, которые вы хотите удалить (создавая их внутри цикла), и удалить все из нихВНЕ петли

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