首页 > 编程语言 >C# ContextMenuStrip创建主菜单与子菜单

C# ContextMenuStrip创建主菜单与子菜单

时间:2024-03-13 17:59:19浏览次数:26  
标签:菜单 ToolStripItem C# Two private new 与子 subMenuTwo

ContextMenuStrip创建主菜单与子菜单

using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Data;

namespace MenuStripExample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //给控件添加Opening事件
            this.contextMenuStrip1.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenu1_Popup);
            //给具体哪个控件添加菜单显示(这里给到整个窗体)
            this.ContextMenuStrip = contextMenuStrip1;
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            //创建菜单
            CreateMenu();
        }

        //主菜单
        protected ToolStripItem[] _menuItem;
        //子菜单(Two)
        private ToolStripItem[] _subMenuTwo;


        /// <summary>
        /// 菜单枚举
        /// </summary>
        private enum MenuIndex
        {
            One = 0,
            Two = 2
        }

        /// <summary>
        /// 创建菜单
        /// </summary>
        protected virtual void CreateMenu()
        {
            _menuItem = new ToolStripItem[]
            {
                new ToolStripMenuItem("One",null,Sumu_Click)
                , new ToolStripSeparator()
                , new ToolStripMenuItem("Two", null, _subMenuTwo)
            };
        }

        private void ContextMenu1_Popup(object sender, CancelEventArgs e)
        {   
            //判断是否有Two这个菜单项
            if (_menuItem.Where(x => x.Text == "Two").Any())
            {
                //如果子菜单(_subMenuTwo)没有值时取值
                if (_subMenuTwo == null || !_subMenuTwo.Any())
                {
                    //从数据库拿子菜单
                    //DataTable dt = new DataTable();
                    //ToolStripItem[] tsArr = new ToolStripItem[dt.Rows.Count];
                    //int count = 0;
                    //foreach (DataRow dr in dt.Rows)
                    //{
                    //    tsArr[count] = new ToolStripMenuItem(string.Concat(dr["数据1"], "-", dr["数据2"].ToString()), null, Sumu_Click);
                    //    count += 1;
                    //}
                    //_subMenuTwo = tsArr;

                    ToolStripItem[] tsArr = new ToolStripItem[1];
                    tsArr[0] = new ToolStripMenuItem(string.Concat("Two", "-", "One").ToString(), null, Sumu_Click);
                    _subMenuTwo = tsArr;

                    var menu = (ToolStripMenuItem)MainMenu(MenuIndex.Two);
                    menu.DropDownItems.Clear();
                    menu.DropDownItems.AddRange(_subMenuTwo);
                }
            }

            //整体更新到控件
            {
                var withBlock = contextMenuStrip1.Items;
                withBlock.Clear();
                withBlock.AddRange(_menuItem);
            }
        }

        /// <summary>
        /// 返回对应下标菜单
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        private ToolStripItem MainMenu(MenuIndex index)
        {
            return _menuItem[(int)index];
        }

        /// <summary>
        /// 菜单点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Sumu_Click(object sender, EventArgs e)
        {
            string text = ((ToolStripMenuItem)sender).Text;
            MessageBox.Show("Sumu_Click:" + $"{text}", "SUMU", MessageBoxButtons.OKCancel);
        }
    }
}

效果图如下:



标签:菜单,ToolStripItem,C#,Two,private,new,与子,subMenuTwo
From: https://www.cnblogs.com/sumu80/p/18070963

相关文章

  • 【模型转换】PyTorch模型转ONNX模型
    我们主要使用torch.onnx.export()函数来实现PyTorch模型到ONNX模型的转换。importtorchimporttorchvision.modelsasmodelsdevice="cpu"#加载预训练的ResNet18模型model=models.resnet18(pretrained=True)model.eval().to(device)#定义输入input=torc......
  • leetcode回溯法典型例题:39.组合总和、40组合总和 II、46.全排列、47.全排列 II
    leetcode回溯法典型例题:39.组合总和、40组合总和II、46.全排列、47.全排列II39.组合总和39.组合总和-力扣(LeetCode)思路构建组合使用递归的方式构建出所有组合。由题意可知,元素可以无限取用,所以我们构建的时候每确定一个数字,进入更深层递归的时候,每个数字都可以取用(此......
  • 【分享】记一次项目迁移(docker java | docker python)
    项目:前端Vue3,后端Python+Java,数据库Redis+MySQL原先部署在centos7里面的,使用的宝塔面板部署的,还算方便。但是服务器要到期了,要将项目迁移到另外一台服务器。另外一台服务器是opencloudos+1plane本来想构建一个jdk1.8+python3.12+Nodejs环境的镜像奈何本人没学过docker,操作起......
  • docker 制作与使用 arcgisserver 镜像
    PS:有状态服务本身不适合部署到容器中,数据恢复比较困难,生产环境请直接安装到Linux服务器中1.准备内容在同级目录下,准备以下内容空的dockerfile文件:arcgisserver.dockerfilelinux版的ArcGISServer安装包:ArcGIS_Server_Linux_xxxxxx.tar.gzArcGISServer的许可文件:ArcGI......
  • ReentrantLock 使用
    ReentrantLock介绍ReentrantLock是Java中的一个可重入锁,它提供了与synchronized关键字类似的功能,但相比synchronized,ReentrantLock提供了更多的灵活性和功能。定义:ReentrantLock是一个可重入且独占式的锁,它具有与使用synchronized监视器锁相同的基本行为和语义,但与......
  • Tomcat目录结构
    目录binconfliblogswebappbin存放tomcat的可执行程序从上图可以看出bin中的文件主要是两种文件,一种是.bat一种是.sh.bat:主要用于windows.sh:主要用于linux.bat文件是Windows操作系统中的批处理文件。它是一种简单的文本文件,其中包含了一系列的命令,用于自动执行一系列任......
  • A visual method to detect meat adulteration by recombinase polymerase amplifica
    创新点:基于重组酶聚合酶扩增(RPA)和侧向流试纸(LFD)的视觉方法,用于鉴定牛肉(Bostaurus)、绵羊(Ovisaries)、猪肉(Susscrofa)、鸭肉(Anasplatyrhynchos)和鸡肉(Gallusgallus)的动物来源。传统的方法需要操作员具备相当的技能、昂贵的仪器,并且无法提供快速的移动式现场检测系统来检测肉制品的......
  • 模板匹配——set_shape_model_clutter
    通过设置杂波,来准确定位要检测对象;如下图中未设置杂波情况下,匹配结果如(3);如图(4)设置杂波后,匹配结果如图(5)**Createashapemodel.*创建一个模型read_image(ImageModel,'/bga_gap/bga_gap_01.png')gen_circle(ROI,753.869,551.624,28.4027)reduce_domain(Image......
  • glibc 2.23 源码分析
    1.基础知识1.1Linux进程内存布局Linux系统在装载elf格式的程序文件时,会调用loader把可执行文件中的各个段依次载入到从某一地址开始的空间中(载入地址取决于linkeditor(ld)和机器地址位数,在32位机器上是0x8048000,即128M处)。以32位机器为例,首先被载入的是.text......
  • C++纯虚函数和抽象类
    在C++中,可以将虚函数声明为纯虚函数,语法格式为:virtual返回值类型函数名(函数参数)=0;纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上=0,表明此函数为纯虚函数。最后的=0并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”。包含纯虚函数的类称......