我已经使用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
}
答案 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);
}