如何检测鼠标按下是否位于行大小调整区域上方
本文关键字:于行大 调整 区域 是否 何检测 检测 鼠标 | 更新日期: 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);
}