从DataGridView中删除行变为空白时的最佳方法
本文关键字:最佳 方法 空白 DataGridView 删除行 | 更新日期: 2023-09-27 18:16:11
我有一个单列的DataGridView在我的应用程序。我想要的是应用程序立即从网格中删除行,如果/当用户呈现它们为空白(通过编辑单元格)。问题是我尝试的每一种方法都进入了死胡同。
实现此行为的最佳方法是什么?我试过了:
- 使用
CellValidated
事件,然后检查值现在是否为空白。- 抛出一个"操作不能执行"异常,因为,显然,c#不允许你在
CellValidated
事件中从DataGridView中删除一行。
- 抛出一个"操作不能执行"异常,因为,显然,c#不允许你在
- 使用
CellEndEdit
事件,然后检查值现在是否为空白- 抛出"操作无法执行"异常,当我试图删除行,如果结束单元格编辑的事件是用户单击在同一网格中的另一个单元格;否则,这似乎可以工作。
- 使用
CellValueChanged
事件,然后检查值现在是否为空白。- 要求检查当前是否正在以编程方式填充网格,但这只是一个不便。
- 忽略这样的情况:用户开始键入新行,然后不进行验证,立即用BACKSPACE删除文本。这将使单元格为空,并且不会触发
CellValueChanged
事件。
我不认为我可以使用CellLeave
事件,因为用户可以锁定一个值,而不需要离开一个单元格点击ENTER。
我知道我有点晚了,但我是这样做的
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
if (!dataGridView1.Rows[e.RowIndex].IsNewRow)
{
if (dataGridView.Rows[e.RowIndex].Cells[0].Value == null)
{
BeginInvoke(new MethodInvoker(delegate
{
dataGridView1.Rows.RemoveAt(e.RowIndex);
}));
}
}
}
我将使用CellStateChanged事件。然后,当一个单元格在某个点失去焦点时(即用户选择了其他单元格),您可以检查它是否为空。此时,可以删除该行。这也会稍微快一些,因为您不需要在修改单元格值时持续检查。否则,如果监听单元格值的变化,事件检查将一直触发。
创建表单时,设置一个标志,rowNumToDelete = -1。OnCellValidated,如果单元格现在为空,rowNumToDelete = row#。OnKeyDown,如果key是(tab/arrow/enter)(或用户可以用来在网格中切换单元格的任何键),并且如果flag> 0,则删除rowNumToDelete处的行并将flag设置回-1。对OnClick做同样的操作。我仍然不确定是否有更好的方法在DataGridView事件处理程序中做到这一点。