如何检测MouseDown是否超过行调整大小区域

时间:2016-07-14 21:32:20

标签: c# winforms datagridview

我已经使用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
}

1 个答案:

答案 0 :(得分:2)

当您使用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);    
}