Previous topicNext topic
Help > 开发指南 > SanMuGrid平台编程 > 主要对象 > BaseGrid > 方法 > 定位 >
HitTest

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);
        }
    }
}