5

我正在使用 VS 2008/C# 并将帮助程序类的本地列表绑定为 DataGridView 控件的数据源。在我的助手类列表上调用 Remove() 方法会触发 DataGridView 的 CellFormatting 事件,这是有道理的(有点)。

当删除网格中最后一行的 DataBoundItem 时(只要网格不止一行),DataGridView 的 Rows 集合在此事件触发之前不会更新。因此,在 CellFormatting 事件处理程序中,我得到一个 IndexOutOfRangeException,因为 Rows 集合太大了。

我尝试使用 DataGridView.Rows.Remove() 方法删除行,并使用 BindingSource 进行绑定,而不是将 List 直接绑定为数据源。

我通过 Google 找到了一些关于此事件的引用,但答案要么没有出现,要么据说在 DataGridView 或 DataGridView.Rows 集合上使用 Delete() 方法——目前都不存在。

排序似乎也不是问题,因为执行/不执行排序会导致相同的结果。

“最后一行”的唯一例外是删除问题是 DataGridView 是否只包含一行 - 在这种情况下一切正常。

4

6 回答 6

12

我过去遇到过这个问题,如果我没记错的话,你可以做两件事之一。从集合中删除记录时,将 datagridview 上的 datasource 属性设置为 null,然后将其重新绑定到列表。这应该够了吧。

或者,您可以在 dataGridview 上处理 DataError 事件,并且在方法中您可以说 e.Cancel = true 来抑制异常,或者您可以在那里进一步处理它。

于 2008-10-08T00:39:37.917 回答
7

首先只是禁用Datagridviewas的属性

dataGridView1.AllowUserToAddRows = false;

然后通过保持-1,使用for循环删除最后一行。

dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1);
dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1);
于 2013-01-30T16:02:13.473 回答
3

要隐藏最后一行,请更改 datagridview 的 AllowUserToAddRows 属性,如下所示:

myDataGridView1.AllowUserToAddRows = false
于 2012-06-06T11:29:11.817 回答
1

我也有同样的问题。我找到了解决方案。尝试将所有行复制到下一行。然后删除第一行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)

尝试一下:)

于 2011-05-06T22:02:30.707 回答
0

这是一个非常古老的问题,但我通过处理 row-remove 事件解决了它,如下所示。

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

它奏效了。

于 2010-10-05T09:47:16.500 回答
0

我知道这是一个老问题,但我找到了另一个对我有用的解决方案。在从数据源/绑定源中删除项目之前,取消连接 CellFormatting 事件的事件处理程序,然后重新连接它。例如:

RemoveHandler DataGridView1.CellFormatting, AddressOf DataGridView1_CellFormatting
Me.BindingSource1.Remove(item)
AddHandler DataGridView1.CellFormatting, AddressOf DataGridView1_CellFormatting
于 2011-03-18T20:20:34.243 回答