【问题标题】:How to delete last row in DataGridView and keep the row selected?如何删除 DataGridView 中的最后一行并保持选中行?
【发布时间】:2015-11-16 14:02:14
【问题描述】:

我是 C# 新手,这不是重复的问题,我在这里检查了类似的问题,但不是运气。

我有 2 个按钮和 DataGridView1ButtonAdd 添加一行,buttonDelete 删除一行。 首先,我单击添加以添加新行并始终保持最后一行被选中。

其次,当我想删除最后一行或任何其他行(通过单击它们)时,它可以完美运行,并且已删除的行保持选中状态(如我所愿)。

现在我添加一行,然后自动选择最后一行,然后当我想删除最后一行时(不点击它但它已经被选中)它给了我一个错误:

“索引超出范围。必须为非负数且小于集合的大小”

但是如果我点击它,它会起作用并且该行保持选中状态。

所以我的问题是我无法删除最后一行而不点击它(但最后一行实际上已经被选中作为添加行的结果)。我想删除它并保持选中的行。 请帮忙,谢谢

public partial class Form1 : Form
{

    Int RowIndex;
    Int RowCount;
    {
        InitializeComponent();
    }


    private void buttonAdd_Click(object sender, EventArgs e)
    {
        RowIndex = dataGridView1.Rows.Count - 1;
        dataGridView1.Rows.Add(1, "pizaa", 3);  //add rows to dataGridView;
        dataGridView1.Rows[RowIndex].Selected = true; //select the added row
    }    

    private void buttonDelete_Click(object sender, EventArgs e)
    {
        RowCount = dataGridView1.Rows.Count;
        RowIndex = RowCount - 1;
        switch (RowCount)
        {
            case 0:     /// no Rows to delete
                break;
            case 1:    /// only one Row to delete
                dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);
                break;
            default:    // otherwise
               dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index); //delete the selected
               dataGridView1.Rows[dataGridView1.SelectedCells[0].RowIndex].Selected = true;  //  select same row after deleting it.
                break;
        }
    }
}    

【问题讨论】:

  • 如果最后一行被删除,则行数减少 1,因此您无法选择与您删除的行具有相同索引的行。错误是由删除产生的还是由删除后的选择产生的?
  • 保罗。我知道并且我虽然知道这一点,但是只有当我单击它并且该行保持选中状态时我才能删除最后一行(因此它工作得很好)。但是如果我不点击它(但它已经被选中)我不能删除它。
  • 我认为对您不想要的行为负责的是属性AllowUserToAddRows(您可能已将其设置为true)。这种情况的特点是它显示了最后一行(供用户输入信息),这并不完全被认为是这样。即:你认为DataGridView中还剩下一行,但事实并非如此。将此属性设置为 false,这样您就有了一个完全可控的情况(您可能需要更正代码的某些部分以避免错误)。
  • 您需要选择特定的单元格吗?将SelectionMode 更改为FullRowSelect 按您的意愿工作。
  • 瓦罗卡巴。我同意你的观点,但我已经将 AllowUserToAddRows 设置为 false,但仍然无效。

标签: c#


【解决方案1】:

据我了解,这实现了您的意图。私有字段 RowIndex 和 RowCount 是不必要的,已被删除。我在 Form 构造函数中应用了一些非默认属性值,以便您可以看到它们。最值得注意的是有一个 SelectionChanged 事件处理程序,用于确定是否启用删除按钮。

这可能不是您想要的,但它应该让您朝着正确的方向前进。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        buttonDelete.Enabled = false;
        dataGridView1.SelectionChanged += dataGridView1_SelectionChanged;
        dataGridView1.MultiSelect = false;
        dataGridView1.AllowUserToAddRows = false;
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void dataGridView1_SelectionChanged(object sender, EventArgs e)
    {
        buttonDelete.Enabled = (((DataGridView)sender).SelectedRows.Count > 0);  
    }

    private void buttonAdd_Click(object sender, EventArgs e)
    {
        int rowIndex = dataGridView1.Rows.Add(1, "pizaa", 3);  //add rows to dataGridView;
        dataGridView1.Rows[rowIndex].Selected = true; //select the added row
    }

    private void buttonDelete_Click(object sender, EventArgs e)
    {
        if (dataGridView1.SelectedRows.Count > 0)
        {
            var index = dataGridView1.SelectedRows[0].Index;
            dataGridView1.Rows.RemoveAt(index);

            // Select the last row if it exists...
            if (dataGridView1.Rows.Count > 0)
            {
                index = (index == 0) ? 0 : --index;
                dataGridView1.CurrentCell.Selected = false;
                dataGridView1.Rows[index].Selected = true;
            }
        }
    }
}

【讨论】:

  • 也许需要补充一些注意事项。 dataGridView Rows Add() 方法返回所添加行的索引。然后使用它来选择网格的索引。 index = (index == 0) ? 0 : index--; 是一个简写的“if”语句,意思是“如果 index == 0,则返回 0,否则将 index 减 1 并返回结果。
  • S.布伦森。谢谢你的帮助,我会测试它并告诉你
  • 删除任何选定的行时,它工作好,但选择最后一行并希望删除它时,它会显示错误:“索引超出范围”。我试图更改代码但没有运气,知道吗?谢谢
  • 对不起。这是在我的索引分配中。我已经更正了语法并应用了其他几个小修复。看看修改后的代码现在是否适合你。
  • 成功了。感谢您的帮助和解释。
猜你喜欢
  • 2014-02-05
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
相关资源
最近更新 更多