DataGridView Removing Rows удаляет только альтернативные строки - PullRequest
4 голосов
/ 28 июня 2011

У меня есть 100 строк в DataGridView. Затем я удаляю каждую строку, как показано ниже, но, поскольку она зацикливается вокруг идентификатора, появляется значение 0,2,4,6,8 и, следовательно, удаляются только четные строки. Что происходит?

                foreach (DataGridViewRow row in dgvData.Rows)
                {
                    try
                    {
                        if (row.IsNewRow)
                            continue;

                        string PalletID = row.Cells[1].Value.ToString();
                        string Location = row.Cells[2].Value.ToString();


                        dgvData.Rows.Remove(row);
                        AddToList(PalletID + " located in " + Location + " was uploaded");
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error Uploading Data");
                        AddToList("Error uploading data " + ex.Message);
                        continue;
                    }
                }

Ответы [ 4 ]

7 голосов
/ 28 июня 2011

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

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

1 голос
/ 28 июня 2011

попробуйте

for (int i = dgvData.Rows.Count - 1; i >= 0; i--)
{
    dgvData.Rows.Remove(dgvData.Rows[i]);
}

вы используете цикл ForEach и удаляете строки из одной коллекции, т.е. dgvData.Rows.То есть отсутствует объект из этой коллекции и не удалось пройти по каждому элементу.
Таким образом, чтобы справиться с этим, вам нужно выполнить цикл сзади, используя приведенный выше код.

Вам необходимо установить значение i соответственно для новой строки, если это позволяет добавлять новую строку ....

1 голос
/ 28 июня 2011

Проблема заключается в том, что вы изменили dgvData.Rows во время прохождения цикла. Я думаю, вам нужно использовать for вместо foreach, если вы хотите удалить элементы в цикле.

РЕДАКТИРОВАТЬ Чтобы быть более ясным:

когда вы удаляете row с помощью в цикле foreach, в первый раз он удалит dgvData.Rows[0], и dgvData.Rows[1] станет новым dgvData.Rows[0]. Поэтому во второй раз, когда он удаляет dgvData.Rows[1], он фактически удаляет исходный dgvData.Rows[2] .. и т. Д.

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

Единственное, что для меня возможно, это то, что

 if (row.IsNewRow)
     continue;

давайте пропустим несколько строк с такими свойствами ... Попробуем разместить там какое-нибудь отладочное сообщение.

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