我有一个带有BindingSource的DataGridView,它将它绑定到DataTable。我在表单上放了一个删除按钮,我希望它在单击时删除当前选中的行,如下所示:
if (dgvResourceSettings.CurrentRow != null && !dgvResourceSettings.CurrentRow.IsNewRow)
{
bindingSource.RemoveCurrent();
}
问题是我的datagridview上可以看到New Row。如果用户选择该行然后单击“删除”按钮,则会删除最后一个数据行,即“新行”上方的数据行。这样做的原因是当datagridview失去焦点时,它会将当前行更改为最后一个数据行(如果当前行是New Row)。我可以通过简单地选中datagridview来验证这一点。
所以我想知道处理这件事的正常方法是什么?我知道用户可以选择行并按DEL键,但我也想给他们一个删除按钮。
感谢。
更新:从答案/评论中看来,这种行为是正常的,因此很难有一个删除按钮和新行。我选择删除New Row并改为添加和删除按钮。
答案 0 :(得分:3)
我的DataGrid
中有一个删除按钮列,每行都有一个按钮,Tag
设置为相应的项目。然后,单击处理程序检索标记值并删除该项。这避免了选择事件等的任何问题。
答案 1 :(得分:1)
源必须是:“当datagridview失去焦点时,它会将当前行更改为最后一个数据行”。这不是正常情况,您必须做某事(keybd事件?)才能实现这一目标。
我在网格下创建了删除按钮,但它们运行良好。
编辑:澄清后,它是关于'新行'的特殊状态,它是一种虚拟的。我有点看到背后的推理,假设选择在离开网格时没有转回。 CurrentRow将为null。在你的情况下,没关系,但往往不会。
一个想法:跟踪Current属性(BindingSource)并禁用Delete按钮,如果没有Row是当前的。检查新行(一半)填充时的工作原理。
除此之外,杰夫的想法看起来也不错。或者在this question上查看BFree的答案。
答案 2 :(得分:1)
解决方案是使用“SelectedRows” - 属性:
if (this.dataGridView1.SelectedRows.Count > 0)
{
foreach (DataGridViewRow dgvrCurrent in dataGridView1.SelectedRows)
{
if (dgvrCurrent == dataGridView1.CurrentRow)
{
dataGridView1.CurrentCell = null;
}
// Delete Row Here
}
答案 3 :(得分:0)
我对DataGridView执行的操作之一是在隐藏列中包含数据库中的ID列。我在datagridview中也有一个Button列,如果单击该按钮,它会抓取该行的RowID并将其发送到数据库类。