如何检测鼠标按下是否位于行大小调整区域上方

本文关键字:于行大 调整 区域 是否 何检测 检测 鼠标 | 更新日期: 2023-09-27 17:57:05

我已经子类化DataGridView,以使用OnMouseDown/Move开始拖动来实现网格行的拖放。它运行良好,但我面临的问题是用户无法再调整行的大小。有没有办法在OnMouseDown中检测指针是否位于"调整行大小"热区,以便我可以跳过开始拖放?

请注意,HitTestInfo.Type不区分行标题和行分隔符。有一个内部字段(typeInternal)可以访问,但无法访问。

以下是相关的代码片段:

var hitTest = grid.HitTest(e.X, e.Y);
int dragRowIndex = hitTest.RowIndex;
if (hitTest.Type == DataGridViewHitTestType.RowHeader && dragRowIndex != -1)
{
    //Start dragging
}

如何检测鼠标按下是否位于行大小调整区域上方

使用HitTest方法对DataGridView执行命中测试时,结果HitTestInfo包含一个名为 typeInternal 的内部字段,其中包含有关所需命中测试结果的其他信息。字段的类型是内部枚举。您可以使用Reflection获取内部字段值,并以这种方式将其强制转换为包含预期值的枚举:

private enum DataGridViewHitTestTypeInternal
{
    None,
    Cell,
    ColumnHeader,
    RowHeader,
    ColumnResizeLeft,
    ColumnResizeRight,
    RowResizeTop,
    RowResizeBottom,
    FirstColumnHeaderLeft,
    TopLeftHeader,
    TopLeftHeaderResizeLeft,
    TopLeftHeaderResizeRight,
    TopLeftHeaderResizeTop,
    TopLeftHeaderResizeBottom,
    ColumnHeadersResizeBottom,
    ColumnHeadersResizeTop,
    RowHeadersResizeRight,
    RowHeadersResizeLeft,
    ColumnHeaderLeft,
    ColumnHeaderRight
}
protected override void OnMouseDown(MouseEventArgs e)
{
    var info = this.HitTest(e.X, e.Y);
    var typeInternal = info.GetType().GetField("typeInternal", 
            System.Reflection.BindingFlags.NonPublic | 
            System.Reflection.BindingFlags.Instance);
    var value = (DataGridViewHitTestTypeInternal)typeInternal.GetValue(info);
    /* Then decide based on value */
    // Rest of logic
    base.OnMouseDown(e);    
}