如何检测鼠标事件是在行分隔符上还是在行本身上

den*_*i21 5 c# datagridview mouseevent winforms datagridviewrow

我有一个DataGridView根据组号分组的行。为了在视觉上分隔不同组的行,我设置了DividerHeight某个组中最后一行的 。

我想为行分隔符和行本身的鼠标事件实现不同的行为。DataGridView.HitTestInfo似乎没有办法检查这一点。有什么办法让我知道行分隔符是否被单击或者是否有任何东西掉落在其上?

我的网格外观的图像。(深灰色区域是行分隔线):

在此输入图像描述

Jim*_*imi 3

DataGridView HitTest()方法返回与指定客户端坐标(相对于 DataGridView 客户端区域的坐标)处的 Row 相关的信息。
您可以使用MouseDownDataGridView 的事件来确定鼠标坐标(MouseEventArgs已经返回相对于控件的客户端区域的鼠标坐标)。

如果命中测试成功,您可以使用其RowIndex属性来确定鼠标指针下的行的边界,调用DataGridView.GetRowDisplayRectangle()

利用此信息,您可以比较鼠标指针相对于行边界的位置以及分隔线占用的区域
分隔线是行边界矩形的一部分

从该值中减去分隔线的高度 ( [Row].DividerHeight) [Row].Bounds.Bottom,并验证鼠标Y位置是否大于该值。

例如:

private void someDataGridView_MouseDown(object sender, MouseEventArgs e)
{
    var dgv = sender as DataGridView;
    var test = dgv.HitTest(e.X, e.Y);
    if (test.RowIndex == -1) return;

    var row = dgv.Rows[test.RowIndex];
    var rowBounds = dgv.GetRowDisplayRectangle(test.RowIndex, false);

    bool isDivider = e.Y >= (rowBounds.Bottom - row.DividerHeight);
}
Run Code Online (Sandbox Code Playgroud)

如果定制绘画到位,请根据需要进行调整