如何使用删除按钮从datagridview中删除行?

时间:2009-04-22 13:27:58

标签: .net winforms datagridview

我有一个带有BindingSource的DataGridView,它将它绑定到DataTable。我在表单上放了一个删除按钮,我希望它在单击时删除当前选中的行,如下所示:

    if (dgvResourceSettings.CurrentRow != null && !dgvResourceSettings.CurrentRow.IsNewRow)
    {
        bindingSource.RemoveCurrent();
    }

问题是我的datagridview上可以看到New Row。如果用户选择该行然后单击“删除”按钮,则会删除最后一个数据行,即“新行”上方的数据行。这样做的原因是当datagridview失去焦点时,它会将当前行更改为最后一个数据行(如果当前行是New Row)。我可以通过简单地选中datagridview来验证这一点。

所以我想知道处理这件事的正常方法是什么?我知道用户可以选择行并按DEL键,但我也想给他们一个删除按钮。

感谢。

更新:从答案/评论中看来,这种行为是正常的,因此很难有一个删除按钮和新行。我选择删除New Row并改为添加和删除按钮。

4 个答案:

答案 0 :(得分:3)

我的DataGrid中有一个删除按钮列,每行都有一个按钮,Tag设置为相应的项目。然后,单击处理程序检索标记值并删除该项。这避免了选择事件等的任何问题。

答案 1 :(得分:1)

源必须是:“当datagridview失去焦点时,它会将当前行更改为最后一个数据行”。这不是正常情况,您必须做某事(keybd事件?)才能实现这一目标。

我在网格下创建了删除按钮,但它们运行良好。

编辑:澄清后,它是关于'新行'的特殊状态,它是一种虚拟的。我有点看到背后的推理,假设选择在离开网格时没有转回。 CurrentRow将为null。在你的情况下,没关系,但往往不会。

一个想法:跟踪Current属性(BindingSource)并禁用Delete按钮,如果没有Row是当前的。检查新行(一半)填充时的工作原理。

除此之外,杰夫的想法看起来也不错。或者在this question上查看BFree的答案。

答案 2 :(得分:1)

解决方案是使用“SelectedRows” - 属性:

if (this.dataGridView1.SelectedRows.Count > 0)
  {
    foreach (DataGridViewRow dgvrCurrent in dataGridView1.SelectedRows)
  {
    if (dgvrCurrent == dataGridView1.CurrentRow)
      {
        dataGridView1.CurrentCell = null;
      }

    // Delete Row Here
  }

答案 3 :(得分:0)

我对DataGridView执行的操作之一是在隐藏列中包含数据库中的ID列。我在datagridview中也有一个Button列,如果单击该按钮,它会抓取该行的RowID并将其发送到数据库类。