C# 用树形列表 动态 显示菜单
如图

页面加载
private void Form1_Load(object sender, EventArgs e)
{
GetMenu(treeView1, menuStrip1);//将menuStrip1控件中的信息添加到treeView1控件中
} /// <summary>
/// 将MenuStrip控件中的首行命令项添加到TreeView控件中
/// </summary>
/// <param treeV="TreeView">TreeView控件</param>
/// <param MenuS="MenuStrip">MenuStrip控件</param>
public void GetMenu(TreeView treeV, MenuStrip MenuS)
{
bool Var_Bool = true;
for (int i = 0; i < MenuS.Items.Count; i++) //遍历MenuStrip组件中的一级菜单项
{
//将一级菜单项的名称添加到TreeView组件的根节点中,并设置当前节点的子节点newNode1
TreeNode newNode1 = treeV.Nodes.Add(MenuS.Items[i].Text);
if (MenuS.Items[i].Enabled == false)//判断当前项是否为可用
{
newNode1.ForeColor = Color.Silver;//改变树节点的字体颜色为不可用色
Var_Bool = false;
}
else
{
newNode1.ForeColor = Color.Black;//改变树节点的字体颜色为可用色
Var_Bool = true;
}
newNode1.Tag = 0;//标识,有子项的命令项
//将当前菜单项的所有相关信息存入到ToolStripDropDownItem对象中
ToolStripDropDownItem newmenu = (ToolStripDropDownItem)MenuS.Items[i];
GetCavernMenu(newNode1, newmenu, Var_Bool);//添加多层命令项
}
} /// <summary>
/// 将MenuStrip控件中的多层命今项添加到TreeView控件中
/// </summary>
/// <param newNodeA="TreeNode">TreeNode对象</param>
/// <param newmenuA="ToolStripDropDownItem">ToolStripDropDownItem对象</param>
/// <param BL="bool">标识(是否可用)</param>
public void GetCavernMenu(TreeNode newNodeA, ToolStripDropDownItem newmenuA, bool BL)
{
bool Var_Bool = true;
if (newmenuA.HasDropDownItems && newmenuA.DropDownItems.Count > 0)
for (int j = 0; j < newmenuA.DropDownItems.Count; j++) //遍历二级菜单项
{
//将二级菜单名称添加到TreeView组件的子节点newNode1中,并设置当前节点的子节点newNode2
TreeNode newNodeB = newNodeA.Nodes.Add(newmenuA.DropDownItems[j].Text);
Var_Bool = true;
if (BL == false)//判断当前命令项的上一级命令是否可用
{
newNodeB.ForeColor = Color.Silver;//设置当前命令项的字体颜色为不可用色
newNodeB.Tag = 0;//标识,不显示相应的窗体
Var_Bool = false;
}
else
{
if (newmenuA.DropDownItems[j].Enabled == false)//判断当前命令项是否为可用
{
newNodeB.ForeColor = Color.Silver;//设置当前命令项的字体颜色为不可用色
newNodeB.Tag = 0;//标识,不显示相应的窗体
Var_Bool = false;
}
else
{
newNodeA.ForeColor = Color.Black;//设置当前命令项的字体颜色为可用色
newNodeB.Tag = int.Parse(newmenuA.DropDownItems[j].Tag.ToString());//标识,显示相应的窗体
}
}
//将当前菜单项的所有相关信息存入到ToolStripDropDownItem对象中
ToolStripDropDownItem newmenuB = (ToolStripDropDownItem)newmenuA.DropDownItems[j];
if (newmenuB.HasDropDownItems && newmenuA.DropDownItems.Count > 0)//如果当前命令项有子项
{
newNodeB.Tag = 0;//标识,有子项的命令项
GetCavernMenu(newNodeB, newmenuB, Var_Bool);//调用递归方法
}
}
}
按钮点击事件
private void toolStripButton1_Click(object sender, EventArgs e)
{
frm_show(//打开MenuStrip控件或TreeView控件相应的窗体
Convert.ToInt16(((ToolStripButton)sender).Tag.ToString()), ((ToolStripButton)sender).Text);
} private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
frm_show(//打开MenuStrip控件或TreeView控件相应的窗体
Convert.ToInt16(e.Node.Tag.ToString()), e.Node.Text);
} /// <summary>
/// 打开MenuStrip控件或TreeView控件相应的窗体
/// </summary>
/// <param n="int">标识</param>
/// <param FName="string">名称</param>
public void frm_show(int n, string FName)
{
switch (n)//通过标识调用各子窗体
{
case 0: break;
case 1:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 2:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 3:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 4:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 5:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 6:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 7:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 8:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 9:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 10:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 11:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 12:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 13:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 14:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 15:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 16:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 17:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 18:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 19:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 21:
{
//打开记事本
System.Diagnostics.Process.Start("notepad.exe");
break;
}
case 22:
{
//打开计算器
System.Diagnostics.Process.Start("calc.exe");
break;
}
case 23:
{
//打开WORD文档
System.Diagnostics.Process.Start("WINWORD.EXE");
break;
}
case 24:
{
//打开EXCEL文件
System.Diagnostics.Process.Start("EXCEL.EXE");
break;
}
case 25:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 26:
{
if (MessageBox.Show("确认退出系统吗?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
Application.Exit();//关闭当前工程
break;
}
case 27:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 28:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 29:
{
Form2 fp = new Form2();//实例化一个窗体
fp.Text = FName;//设置窗体的名称
fp.ShowDialog();//用模试对话框打开窗体
fp.Dispose();//释放窗体的所有资原
break;
}
case 30:
{
//打开帮助对话框
MessageBox.Show("\t你可以到明日科技网站\t\n\n\t 得到你想知道的\n\t 谢谢使用!!");
break;
}
}
}
C# 用树形列表 动态 显示菜单的更多相关文章
- Bootstrap 树形列表与右键菜单
Bootstrap 树形列表与右键菜单 介绍两个Bootstrap的扩展 Bootstrap Tree View 树形列表 jQuery contextMenu 右键菜单 Demo采用CDN分发,直接 ...
- Winform开发主界面菜单的动态树形列表展示
我在之前很多文章里面,介绍过Winform主界面的开发,基本上都是标准的界面,在顶部放置工具栏,中间区域则放置多文档的内容,但是在顶部菜单比较多的时候,就需要把菜单分为几级处理,如可以在顶部菜单放置一 ...
- 【插件篇】前段bootstrap-table-treegrid试手,解决无法显示树形列表或者图标不显示问题。
说明:具体代码操作我就不贴了.官方有正规的例子!bootstrap-table-examples传送 使用注意事项: 传入的id和pid可以是string类型的(我后台返回的是Long类型转换成str ...
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形网格动态加载
jQuery EasyUI 树形菜单 - 树形网格动态加载 动态加载树形网格有助于从服务器上加载部分的行数据,避免加载大型数据的长时间等待.本教程将向您展示如何创建带有动态加载特性的树形网格(Tree ...
- EBS 显示主页面的工作列表和主菜单
EBS环境: R12.1.3 问题描述:如果系统的“个性化页”做了设置,可能出现登录系统后,如果下图红框中的 主菜单和工作列表没有显示的情况,如果需要重新显示“主菜单”和“工作列表”,可参考以下操作 ...
- 使用jQuery 中的显示与隐藏动画效果实现折叠下拉菜单的收缩和展开,在页面的列表中有若干项,列表的每项中有一个二级列表,二级列表默认为隐藏状态。点击列表的项,切换二级列表的显示或隐藏状态
查看本章节 查看作业目录 需求说明: 使用jQuery 中的显示与隐藏动画效果实现折叠下拉菜单的收缩和展开,在页面的列表中有若干项,列表的每项中有一个二级列表,二级列表默认为隐藏状态.点击列表的项,切 ...
- Ajax-ajax实例3-动态树形列表
项目结构: 项目演示: 技术要点: 1.3.2 技术要点在基本原理的介绍中,了解到通过在父节点内动态创建子节点,并利用样式表缩进完成树形列表的基本框架.除了这一点外,还有下面一些问题需要考虑.1 .将 ...
- 在Bootstrap开发框架中使用bootstrapTable表格插件和jstree树形列表插件时候,对树列表条件和查询条件的处理
在我Boostrap框架中,很多地方需要使用bootstrapTable表格插件和jstree树形列表插件来共同构建一个比较常见的查询界面,bootstrapTable表格插件主要用来实现数据的分页和 ...
- python 全栈开发,Day109(客户管理之动态"二级"菜单)
昨日内容回顾 1. 权限有几张表? 2. 简述权限流程? 3. 为什么要把权限放入session? 4. 静态文件和模块文件 5. 相关技术点 - orm查询 - 去空 - 去重 - 中间件 - in ...
- python 全栈开发,Day108(客户管理之权限控制,客户管理之动态"一级"菜单,其他应用使用rbac组件,django static文件的引入方式)
一.客户管理之权限控制 昨天的作业,有很多不完善的地方 下载代码,基本实现权限验证 https://github.com/987334176/luffy_permission/archive/v1.2 ...
随机推荐
- springboot——入门案例
真简单啊 springboot 学了入门案例,有感而发 首先是一个自带的配置文件: package com.example.springboot_01; import org.springframew ...
- django-celery-results - 使用 Django ORM/Cache 作为结果后端
https://docs.celeryq.dev/en/stable/django/first-steps-with-django.html#django-celery-results-using-t ...
- hszxoj 矿场搭建 [tarjan]
hszxoj 矿场搭建 题目描述 原题来自:HNOI 2012 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决 ...
- Kernel Memory 入门系列:文档的管理
Kernel Memory 入门系列: 文档的管理 在Quick Start中我们了解到如何快速直接地上传文档.当时实际中,往往会面临更多的问题,例如文档如何更新,如何划定查询范围等等.这里我们将详细 ...
- Calico IPIP模式下的Cross Subnet特性分析
本文分享自华为云社区<Calico IPIP模式下的CrossSubnet特性分析>,作者: 可以交个朋友. Calico ipip crossSubnet 模式 Calico-ipip模 ...
- java方法的定义与执行
java中的方法在类中定义. 定义方法格式: 访问修饰符 返回值类型 方法名(参数列表){ ... 执行内容 ... return 返回值; } 访问修饰符:表示方法在哪里能被 ...
- ElasticSearch之cat transforms API
命令样例如下: curl -X GET "https://localhost:9200/_cat/transforms?v=true&format=json" --cace ...
- 通过数字证书对PDF电子文件进行数字签名/盖章
以下代码详细说明如何使用数字证书对PDF电子文件进行数字签名/盖章.PDF文件签署主要传递PDF文件,数字证书信息,签章图片3个信息.代码中需要的文件.数字证书.签章图片可访问开放签电子签章开源系统详 ...
- C#数据结构与算法系列(十六):时间复杂度(上)
1.时间频度 介绍: 一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,他花费时间越多.一个算法中的语句执行次数称为语句频度或时间频度 举例说明: 比如计算1-100所有数字 ...
- AI 图像自动补全 Uncrop 工具介绍
ClipDrop Uncrop是一款基于AI的图像自动补全工具,由StabilityAI旗下的Clipdrop开发.通过利用StableDiffusionXL开发的算法和深度学习技术,Uncrop可以 ...