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

khbbv19g  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(118)

我有一个DataGridView,其中的行是根据组号分组的,为了直观地分隔不同组中的行,我设置了某个组中最后一行的DividerHeight
我想为行分隔符和行本身的鼠标事件实现一个不同的行为。DataGridView.HitTestInfo似乎没有检查这个的方法。有没有什么方法可以让我知道行分隔符是否被点击或者是否有东西被放在上面?
显示网格外观的图像。(深灰色区域是行分隔线):

ds97pgxw

ds97pgxw1#

DataGridView HitTest()方法返回与指定工作区坐标(相对于DataGridView Client区域的坐标)处的Row相关的信息。
可以使用DataGridView的MouseDown事件确定鼠标坐标(MouseEventArgs已返回相对于控件的客户端区域的鼠标坐标)。
如果命中测试成功,则可以使用其RowIndex属性来确定鼠标指针下的行的边界,调用DataGridView.GetRowDisplayRectangle()
使用此信息,您可以比较鼠标指针相对于行边界的位置和分隔线所占的区域
分隔线是行的边框的一部分
[Row].Bounds.Bottom值中减去分隔线的高度([Row].DividerHeight),并验证鼠标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);
}

如果定制喷漆到位,则根据需要进行调整

相关问题