Удалить последнюю строку с привязкой к данным DataGridView C # - PullRequest
5 голосов
/ 08 октября 2008

Я использую VS 2008 / C # и привязываю локальный список вспомогательных классов в качестве источника данных для элемента управления DataGridView. Вызов метода Remove () в моем списке вспомогательных классов вызывает событие CellFormatting объекта DataGridView, что имеет смысл (немного).

При удалении того, что происходит с DataBoundItem последней строки в сетке (если сетка имеет более одной строки), коллекция строк DataGridView не обновляется до того, как сработает это событие. Итак, в обработчике CellFormatting я получаю исключение IndexOutOfRangeException, поскольку коллекция строк слишком велика.

Я попытался удалить строку с помощью метода DataGridView.Rows.Remove () и связать ее с помощью BindingSource, а не привязывать List напрямую как источник данных.

Я нашел несколько ссылок на это вхождение через Google, но ответы либо не были получены, либо сказано, что он использует метод Delete () в DataGridView или в коллекции DataGridView.Rows - ни один из которых в настоящее время не существует.

Сортировка также не является проблемой, поскольку выполнение / невыполнение сортировки приводит к тому же результату.

Единственное исключение из «последней строки», являющегося проблемой для удаления, - это если DataGridView содержит только одну строку - в этом случае все работает нормально.

Ответы [ 6 ]

10 голосов
/ 08 октября 2008

У меня была эта проблема в прошлом, и если я правильно помню, есть одна из двух вещей, которые вы можете сделать. Когда вы удаляете запись из коллекции, присвойте свойству источника данных в datagridview значение null, а затем снова свяжите его со своим списком. Это должно сработать.

В качестве альтернативы, вы можете обработать событие DataError в вашем dataGridview и в методе, который вы можете сказать e.Cancel = true, чтобы подавить исключение, или вы можете дополнительно обработать его там.

2 голосов
/ 30 января 2013

Сначала просто отключите свойство Datagridview как

dataGridView1.AllowUserToAddRows = false;

, а затем просто удалите из последних строк столько строк, сколько вы хотите, используя цикл for, сохранив -1.

dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1);
dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1);
2 голосов
/ 06 июня 2012

Чтобы скрыть последнюю строку, измените свойство AllowUserToAddRows вида сетки данных, как показано:

myDataGridView1.AllowUserToAddRows = false
0 голосов
/ 07 мая 2011

У меня такая же проблема. Я нашел решение. Попробуйте скопировать все строки в следующую строку. затем удалите первый ряд dgv. Пример кода для этого:

    If Dgv.CurrentCell.RowIndex + 1 = Dgv.Rows.Count Then
        For m = Dgv.Rows.Count - 2 To 0 Step -1
            Dgv.Rows(m + 1).Cells(0).Value = Dgv.Rows(m).Cells(0).Value
            Dgv.Rows(m + 1).Cells(1).Value = Dgv.Rows(m).Cells(1).Value
            Dgv.Rows(m + 1).Cells(2).Value = Dgv.Rows(m).Cells(2).Value
            Dgv.Rows(m + 1).Cells(3).Value = Dgv.Rows(m).Cells(3).Value

        Next
        Dgv.Rows.RemoveAt(0)
        Exit Sub
    End If
    Dgv.Rows.Remove(Dgv.CurrentRow)

попробуй:)

0 голосов
/ 18 марта 2011

Я знаю, что это старый вопрос, но я нашел другое решение, которое сработало для меня. Перед удалением элемента из источника данных / источника привязки отсоедините обработчик события для события CellFormatting, а затем снова подключите его. Например:

RemoveHandler DataGridView1.CellFormatting, AddressOf DataGridView1_CellFormatting
Me.BindingSource1.Remove(item)
AddHandler DataGridView1.CellFormatting, AddressOf DataGridView1_CellFormatting
0 голосов
/ 05 октября 2010

Это очень старая проблема, но я решил ее, обработав событие row-remove следующим образом.

private void dgViewItems_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
{
     dataAdapter.Update((DataTable)bindingSource1.DataSource);
}

и это сработало.

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