DataGridView CellMouseEnter检测灰色区域

DataGridView CellMouseEnter detecting grey area

我正在尝试在 DataGridView 控件中模拟悬停事件,以便在 DataGridViewImageColumn 悬停时显示 Cursor.Hand

我正在尝试这个(订阅 CellMouseEnter

dgv_tabla.CellMouseEnter += dgv_tabla_Hover;

并检查 RowIndex 是否不是 -1

private void dgv_tabla_Hover(object sender, DataGridViewCellEventArgs e)
{
    //The index of the column where i want to show Cursor.Hand
    var index = dgv_tabla.Columns["Remove"].Index;

    if (e.ColumnIndex == index && e.RowIndex >= 0)
        dgv_tabla.Cursor = Cursors.Hand;
    else
        dgv_tabla.Cursor = Cursors.Default;
}

问题是,当我将鼠标悬停在 "Remove" 单元格上并向下移动鼠标(到“'grey area'”)时,Cursor.Hand 不会更改为 Cursor.Default

更好理解的图片:

有什么方法可以实现吗?

谢谢!

使用 CellMouseLeave 事件将光标重置为默认值。在这种情况下,您不需要 else 分支:

dgv_tabla.CellMouseEnter += dgv_tabla_Hover;
dgv_tabla.CellMouseLeave += dgv_tabla_CellMouseLeave;

private void dgv_tabla_Hover(object sender, DataGridViewCellEventArgs e)
{
    //The index of the column where i want to show Cursor.Hand
    var index = dgv_tabla.Columns["Remove"].Index;

    if (e.ColumnIndex == index && e.RowIndex >= 0)
        dgv_tabla.Cursor = Cursors.Hand;
}

private void dgv_tabla_CellMouseLeave(object sender, DataGridViewCellEventArgs e)
{
    dgv_tabla.Cursor = Cursors.Default;
}

另一种解决方案是使用 MouseMove 事件并在上面的评论中执行 HitTest 。在这种情况下,您的代码将如下所示:

dgv_tabla.MouseMove += Dgv_tabla_MouseMove;


private void Dgv_tabla_MouseMove(object sender, MouseEventArgs e)
{
    int index = dgv_tabla.Columns["Remove"].Index;

    DataGridView.HitTestInfo info = dgv_tabla.HitTest(e.X, e.Y);
    if (info.ColumnIndex == index && info.RowIndex >= 0)
        dgv_tabla.Cursor = Cursors.Hand;
    else
        dgv_tabla.Cursor = Cursors.Default;
}