Previous topicNext topic
Help > 开发指南 > SanMuGrid平台编程 > 主要对象 > BaseGrid > 事件 >
BeforeShowContextMenu

BeforeShowContextMenu显示表的右键菜单之前触发。我们可以在此事件中修改显示的菜单。替换成我们自己自定义的菜单,以实现个性化定制。

e参数 说明
ContextMenu此参数返回系统默认的右键菜单,我们既可以自己弄一个全新的菜单赋值给它,以替换系统原本的默认菜单,也可以在系统默认菜单上进行添加、删除一些菜单,来实现右键菜单的个性化定制。
Cancel 此参数可以禁用某些系统默认的右键菜单。

要想个性化定制表格的右键菜单的第一步,就是需要在“代码管理”——“右键菜单”里面做一套自己的右键菜单。

第二步,到表事件BeforeShowContextMenu中写代码。

Vb.Net
Private m_haveAddColumnMenu As Boolean=False '弄一个临时变量,用来记录当前右键菜单是否添加过,
Public Sub BeforeShowContextMenu(sender As Object,e As  sanMuSoft.CS.WinForm.BeforeShowContextMenuEventArgs)
    Select Case e.HitType
        Case HitTestTypeEnum.RowHeader
            '如果是行标题,直接用自定义菜单代替
            e.ContextMenu=Proj.GridContextMenu("选择区域右键菜单")
        Case HitTestTypeEnum.ColumnHeader
            '这里可以单独地添加一个或多个自定义菜单
            If m_haveAddColumnMenu=False Then '如果没有添加过菜单就添加,添加过了就不再重复添加了
                Dim lnk As New SmCommandLink()
                lnk.Name="lnkTestMenu"
                '命令菜单上显示的文本
                lnk.Text="插入右键菜单"
                '是否显示分隔符
                lnk.Delimiter=True
                '鼠标移动到此菜单上时会提示出来的信息
                lnk.ToolTipText="这是插入右键菜单的提示信息"
                Dim cmd As New SmCommand()
                cmd.Name="cmdTestMenu"
                cmd.Text="插入右键菜单"
                cmd.ToolTipText="命令中设置的ToolTipText"
                '设置命令的图标
                cmd.Image=Sys.GetImage("accept_16x16.png",Path.Combine(Proj.ApplicationPath,"Images"))
                '绑定命令的单击事件
                AddHandler cmd.Click, AddressOf UserCommand_Click
                '将命令引用到菜单链接里面
                lnk.Command=cmd
                '将菜单链接添加到系统默认菜单里面
                e.ContextMenu.CommandLinks.Add(lnk)
                m_haveAddColumnMenu=True
            End If
        Case Else
            '如果是其他部位的右键菜单,一律禁用
            e.Cancel=True
    End Select
End Sub
Private Sub UserCommand_Click(ByVal sender As System.Object, ByVal e As C1.Win.C1Command.ClickEventArgs)
    '获得对命令的引用
    Dim cmd As SmCommand = CType(sender, SmCommand)
    '获得对SmCommandLink的引用
    Dim lnk As sanMuSoft.CS.WinForm.Controls.SmCommandLink = CType(e.CallerLink, sanMuSoft.CS.WinForm.Controls.SmCommandLink)
    MessageBox.Show(String.Format("当前菜单命令的文本为:{0},当前命令的名称为:{1}",lnk.Text,cmd.Name))
    
End Sub

C#
private bool m_haveAddColumnMenu = false; // 弄一个临时变量,用来记录当前右键菜单是否添加过,

public void BeforeShowContextMenu(object sender, sanMuSoft.CS.WinForm.BeforeShowContextMenuEventArgs e)
{
    switch (e.HitType)
    {
        case HitTestTypeEnum.RowHeader:
            {
                // 如果是行标题,直接用自定义菜单代替
                e.ContextMenu = Proj.GridContextMenu["选择区域右键菜单"];
                break;
            }

        case HitTestTypeEnum.ColumnHeader:
            {
                // 这里可以单独地添加一个或多个自定义菜单
                if (m_haveAddColumnMenu == false) //如果没有添加过菜单就添加,添加过了就不再重复添加了
                {
                    SmCommandLink lnk = new SmCommandLink();
                    lnk.Name = "lnkTestMenu";
                    // 命令菜单上显示的文本
                    lnk.Text = "插入右键菜单";
                    // 是否显示分隔符
                    lnk.Delimiter = true;
                    // 鼠标移动到此菜单上时会提示出来的信息
                    lnk.ToolTipText = "这是插入右键菜单的提示信息";
                    SmCommand cmd = new SmCommand();
                    cmd.Name = "cmdTestMenu";
                    cmd.Text = "插入右键菜单";
                    cmd.ToolTipText = "命令中设置的ToolTipText";
                    // 设置命令的图标
                    cmd.Image = Sys.GetImage("accept_16x16.png", Path.Combine(Proj.ApplicationPath, "Images"));
                    // 绑定命令的单击事件
                    cmd.Click += UserCommand_Click;
                    // 将命令引用到菜单链接里面
                    lnk.Command = cmd;
                    // 将菜单链接添加到系统默认菜单里面
                    e.ContextMenu.CommandLinks.Add(lnk);
                    m_haveAddColumnMenu = true;
                }

                break;
            }

        default:
            {
                // 如果是其他部位的右键菜单,一律禁用
                e.Cancel = true;
                break;
            }
    }
}

private void UserCommand_Click(System.Object sender, C1.Win.C1Command.ClickEventArgs e)
{
    // 获得对命令的引用
    SmCommand cmd = (SmCommand)sender;
    // 获得对SmCommandLink的引用
    sanMuSoft.CS.WinForm.Controls.SmCommandLink lnk = (sanMuSoft.CS.WinForm.Controls.SmCommandLink)e.CallerLink;
    MessageBox.Show(string.Format("当前菜单命令的文本为:{0},当前命令的名称为:{1}", lnk.Text, cmd.Name));
}