如何在鼠标离开单元格时结束DataGridView单元格中的编辑模式

本文关键字:单元格 DataGridView 模式 编辑 结束 鼠标 离开 | 更新日期: 2023-09-27 18:22:00

在我看来,通过在其他对象上单击鼠标来结束一个单元格中的编辑模式的默认行为有点笨拙。我认为可以肯定地说,如果用户抓住鼠标并将其从处于编辑模式的单元格中移开,他们就完成了对单元格的编辑。这将允许我验证他们的输入,而不需要他们首先点击某些内容。更好的用户体验IMHO。

那么,当鼠标从处于编辑模式的单元格移动一定距离(或一定时间间隔)时,如何让DataGridView自动结束单元格的编辑模式呢?

如何在鼠标离开单元格时结束DataGridView单元格中的编辑模式

我使用以下方法使其工作。它运行良好。编辑结束后,我将当前单元格设置为同一行中的不可编辑单元格,以保留行选择,但仍退出可编辑单元格。

我还在CellEndEdit事件中添加了InEditMode=false,以防用户在代码为其执行编辑模式之前退出编辑模式。

经过测试,我发现在50像素外结束编辑比100像素更好。

bool InEditMode = false;
Point EditStartLocation;
private void dgv_TimeCard_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
    EditStartLocation = dgv_TimeCard.PointToClient(Cursor.Position);
    InEditMode = true;
}
private void dgv_TimeCard_MouseMove(object sender, MouseEventArgs e)
{
    if (InEditMode == false) return;
    int DistanceToEndEdit = 50;
    if (Math.Abs(EditStartLocation.X - e.X) > DistanceToEndEdit || Math.Abs(EditStartLocation.Y - e.Y) > DistanceToEndEdit)
    {
        dgv_TimeCard.EndEdit();
        dgv_TimeCard.CurrentCell = dgv_TimeCard.CurrentRow.Cells["Date"];
        InEditMode = false;
    }
}
private void dgv_TimeCard_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    InEditMode = false;
}