【问题标题】:Delete a Row from a DataGridView given its index给定索引,从 DataGridView 中删除一行
【发布时间】:2010-12-12 09:16:32
【问题描述】:

我的 DataGridView 是单行选择,并且有一个 rowEnter 事件,每次所选行更改时我都会在其中获取行索引。

    private void rowEnter(object sender, DataGridViewCellEventArgs e)
    {
        currentRowIndex = e.RowIndex;
    }

当我按下删除按钮时,我使用相同的索引来删除行

            myDataSet.Avaliado.Rows[currentRowIndex].Delete();
            avaliadoTableAdapter.Update(myDataSet.Avaliado);

如果没有对 DataGridView 中的列进行排序,则它可以正常工作,否则会出错。应该如何知道数据集中与 DataGridView 中的行索引相对应的行索引?

【问题讨论】:

    标签: c# winforms datagridview sql-server-ce


    【解决方案1】:

    我通常将该行的主键作为隐藏列(我的惯例是使用第一个使用列)。

    然后我可以让我的持久层完成剩下的工作。

    【讨论】:

      【解决方案2】:

      您可以在删除时找到当前选定的行:

      if(myDataGridView.SelectedRows.Count > 0)
           currentRowIndex = myDataGridView.SelectedRows[0].Index;
      

      【讨论】:

      • 它与我已经从 rowEnter 事件中获得的值相同,不是吗? DataGridView 中的一行有一个索引,数据集中的一行数据有另一个位置,不一定对应于 DataGridView。这就是重点。
      • 对不起。我以为您的意思是在对列进行排序时丢失了正确的索引。 myDataGridView.SelectedRows[0].DataBoundItem 确实是您感兴趣的内容。
      【解决方案3】:

      您无需在每次选择新行时都获取当前行索引。试试这样的:

      if (_Grid.SelectedRows.Count <= 0) { return; } // nothing selected
      
      DataGridViewRow dgvRow = _Grid.SelectedRows[0];
      
      // assuming you have a DataTable bound to the DataGridView:
      DataRowView row = (DataRowView)dgvRow.DataBoundItem;
      // now go about deleting the row however you would do that.
      

      如果您将某种其他类型的数据类型绑定到网格的每一行,只需将 DataGridViewRow.DataBoundItem 转换为您的数据类型即可。

      【讨论】:

      • 太好了,非常感谢。只是一个评论。你在慌张中犯了一个错误。不严重。 :) DataRowView 行 = (DataRowView)dgvRow.DataBoundItem;唯一奇怪的是,当删除 DGV 中的最后一行时,DVG 并没有选择上一个可用行。
      • 糟糕!你是对的。我正在查看的用于生成该示例代码的示例代码涉及绑定到 DataGridView 的 BindingList,因此没有中间 DataRowView。我将更新示例...
      猜你喜欢
      • 1970-01-01
      • 2019-02-06
      • 2015-05-04
      • 2016-08-02
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多