如何删除DataGridView中的最后一行并保持选中行?

时间:2015-11-16 14:02:14

标签: c#

我是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 个答案:

答案 0 :(得分:0)

这实现了我理解的意图。私有字段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;
            }
        }
    }
}