HitTest根据指定的X、Y坐标获得相应区域属于哪种类型。此方法在处理BeforeMouseDown事件时特别有用。它允许您确定鼠标是否位于特定单元格、单元格按钮、Resizing元素大小等上。
语法
名称 |
描述 |
HitTest(Int32,Int32) | 返回有关控件曲面上指定点处控件的信息。 |
HitTest(Point) | 返回有关控件曲面上指定点处控件的信息。 |
HitTest() | 返回有关当前鼠标位置的控件的信息。 |
返回的是一个HitTestInfo结构,这个结构里面有很多有用的信息。
名称 |
描述 |
Column | 获取测试点处列的索引(如果该点与单元格不对应,则返回-1)。 |
IsFooter | 获取鼠标是否位于页脚上。 |
Point | 控件表面上的点,以像素为单位。 |
Row | 获取测试点的行索引(如果该点与单元格不对应,则返回-1)。 |
Type | HitTestTypeEnum枚举类型,此属性允许您确定点是对应于网格单元还是对应于特殊元素,如行标题和列标题、调整区域大小等。 |
X | 控件表面上点的X坐标,以像素为单位。 |
Y | 控件表面上点的Y坐标,以像素为单位。 |
HitTestTypeEnum枚举
名称 | 值 | 说明 |
None | 0 | 该点位于网格的空白区域。 |
Cell | 1 | 该点位于网格单元上。(单元坐标存储在和属性中)。 |
ColumnHeader | 2 | 该点位于固定行上,位于列上。 |
ColumnResize | 3 | 该点位于列大小调整区域中固定单元格的右边缘附近。 |
ColumnFreeze | 4 | 该点位于柱冻结区域中最后一个冻结柱的右边缘附近。 |
RowHeader | 5 | 该点位于固定列上,紧邻一行。 |
RowHeader | 6 | 该点位于行大小调整区域中固定单元格的底边附近。 |
RowFreeze | 7 | 该点位于行冻结区域中最后一个冻结行的底部边缘附近。 |
Checkbox | 8 | 这一点在复选框上。 |
EditButton | 9 | 该点位于编辑按钮(下拉、弹出编辑器)上。 |
OutlineTree | 10 | 该点位于轮廓栏上(当网格的属性具有包含该标志的标记时可见)。 |
FilterIcon | 11 | 该点位于轮廓树上的“折叠/展开”按钮上(当网格的属性包含该标志时可见)。 |
ExpressionIcon | 12 | 该点位于列标题单元格的过滤器图标上。 |
PinIcon | 13 | 该点位于列标题单元格上的表达式编辑器图标上。 |
在一些可以获取到鼠标坐标的事件中,我们就可以利用HitTest方法来获取到相应的信息。比如BeforeMouseDown、MouseClick、MouseDoubleClick等等。
比如我们可以实现一个双击行标题然后弹出相关信息的代码。
Vb.Net
Public Sub SmGrid1_MouseDoubleClick(sender As Object,e As System.Windows.Forms.MouseEventArgs)
Dim tbl As SmGrid=sender
'获得HitTestInfo结构
Dim hit As HitTestInfo= tbl.HitTest(e.X,e.Y)
'如果当前鼠标点击的位置位于行标题
If hit.Type=HitTestTypeEnum.RowHeader Then
'弹窗显示当前鼠标点击位置的行号
MessageBox.Show("当前行号为:"+ hit.Row)
'如果想显示行标题中的序号的话
If tbl.Rows(hit.Row).DataIndex>=0 Then
MessageBox.Show("当前行标题序号为:"+ tbl.Rows(hit.Row).DataIndex+1)
'另外一种获得方法
MessageBox.Show("当前行标题序号为:"+ tbl.Rows(hit.Row).GetRowData().Index+1)
End If
End If
End Sub
C# |
public void SmGrid1_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e) { SmGrid tbl = sender; // 获得HitTestInfo结构 HitTestInfo hit = tbl.HitTest(e.X, e.Y); // 如果当前鼠标点击的位置位于行标题 if (hit.Type == HitTestTypeEnum.RowHeader) { // 弹窗显示当前鼠标点击位置的行号 MessageBox.Show("当前行号为:" + hit.Row); // 如果想显示行标题中的序号的话 if (tbl.Rows[hit.Row].DataIndex >= 0) { MessageBox.Show("当前行标题序号为:" + tbl.Rows[hit.Row].DataIndex + 1); // 另外一种获得方法 MessageBox.Show("当前行标题序号为:" + tbl.Rows[hit.Row].GetRowData().Index + 1); } } } |