我是C#的新手,这不是重复的问题,我在这里检查了类似的问题,但没有运气。
我有2个按钮和DataGridView1
。
ButtonAdd
添加一行,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;
}
}
}
答案 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;
}
}
}
}