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 ...
随机推荐
- 快速入门:使用 .NET Aspire 组件实现缓存
前言 云原生应用程序通常需要各种类型的可扩展缓存解决方案来提高性能..NET Aspire 组件简化了连接到流行的缓存服务(例如 Redis)的过程,今天小编就为大家简单介绍一下如何使用 .NET A ...
- Storm 集群的搭建及其Java编程进行简单统计计算
一.Storm集群构建 编写storm 与 zookeeper的yml文件 storm yml文件的编写 具体如下: version: '2' services: zookeeper1: image: ...
- Windows下使用C#和32feet.NET开发蓝牙传输功能的记录
引用的第三方Nuget库 32feet.NET 3.5.0 MaterialDesignColors MaterialDesignThemes Newtonsoft.Json 使用到的技术: XAML ...
- Python借助企业微信群机器人发送消息、图片和文件
企业微信功能日益强大,腾讯官方也提供了丰富的API供开发者实现企业微信的很多自动化场景.比如,如何给某个企业微信群发送消息.图片或者文件,甚至@指定群用户?别急,看小爬君轻松教会大家. Step1:在 ...
- VSCode C++开发环境配置: LLVM clang clangd
工欲善其事,必先利其器 llvm/clang 比 VSCode 自带的代码提示功能速度更快,功能更强(支持 clang-tidy). 安装 llvm.clang sudo apt install ll ...
- 文心一言 VS 讯飞星火 VS chatgpt (46)-- 算法导论6.1 4题
四.假设一个最大堆的所有元素都不相同,那么该堆的最小元素应该位于哪里? 文心一言: 最大堆的最小元素位于堆的根结点.由于最大堆的性质,根结点是堆中所有元素的最大值,因此它也是堆中所有元素的最小值. 讯 ...
- 2021-01-14:timsort是什么,如何用代码实现?
福哥答案2021-01-14: 答案来自此链接: 介绍: timsort是一种混合.稳定高效的排序算法,源自合并排序和插入排序,旨在很好地处理多种真实数据.它由Tim Peters于2002年实施使用 ...
- .Net 系列:Attribute特性的高级使用及自定义验证实现
一.特性是什么?特性有什么用? 特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签. 您可以通过使用特性向程序添加声明性信息.一个声明 ...
- 一文详解kube-apiserver认证鉴权能力
本文分享自华为云社区<kube-apiserver认证鉴权能力>,作者: 可以交个朋友. HTTPS为什么要进行身份验证 首先不管是kubectl还是API调用都是通过HTTPS访问kub ...
- 云小课|MRS基础原理之Hue组件介绍
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:Hue是一组WEB ...