Winfrom 开发系统导航菜单
先上图看效果在说.
效果图如上,在Web中这个一点难度都没有,几行Css+JS就搞定了.但是在Winfrom中.本来就是半杯水的水准,想做这个个导航菜单,发现真难找,找了很多都不合胃口,只能自己写个了.现在基本功能完善,可根据系统设置的权限显示菜单,缺点和不足,添加菜单固定不能从数据库菜单表中直接读,根据用户权限显示菜单过于麻烦,在视图模式下,控件会有问题.发到这里以便共同学习和改善此控件。
步骤一:添加用户控件 例 在项目中添加UserControls文件夹-添加用户控件 NavBar
步骤二:在用户控件属性里设置其默认大小, 且添加个Panle 设置 Dock=Fill
步骤三:添加一个NarBarItem 类 此类为导航菜单的二级菜单
- /// <summary>
- /// 二级菜单的项
- /// </summary>
- public class NarBarItem : UserControl
- {
- public NarBarItem(string text,int ImageIndex)
- {
- this.Text = text;
- this.imageIndex = ImageIndex;
- }
- /// <summary>
- /// 二级菜单的图片索引
- /// </summary>
- public int imageIndex
- {
- get;
- set;
- }
- }
步骤四:添加导航菜单的一级菜单类 ButtonGroup
- /// <summary>
- /// 导航栏中的导航条
- /// </summary>
- public class ButtonGroup : UserControl
- {
- /// <summary>
- /// 一级菜单的事件
- /// </summary>
- public event EventHandler TitleBarClick;
- public event ButtonClickHander ImageButtonClick;
- public ButtonGroup(string text)
- {
- Text = text;
- InitializeControl();
- #region 加载所有图标
- imageItem.Images.Add(Resources.group);
- imageItem.Images.Add(Resources.level);
- imageItem.Images.Add(Resources._lock);
- imageItem.Images.Add(Resources.keyboard);
- imageItem.Images.Add(Resources.kshop_hover);
- imageItem.Images.Add(Resources.list);
- imageItem.Images.Add(Resources.lorry_add);
- imageItem.Images.Add(Resources.mcard_mlist);
- imageItem.Images.Add(Resources.message);
- imageItem.Images.Add(Resources.mlist_hover);
- imageItem.Images.Add(Resources.mobile);
- imageItem.Images.Add(Resources.money);
- imageItem.Images.Add(Resources.mouse);
- imageItem.Images.Add(Resources.news);
- imageItem.Images.Add(Resources.news);
- imageItem.Images.Add(Resources.pc);
- imageItem.Images.Add(Resources.privilege);
- imageItem.Images.Add(Resources.prod);
- imageItem.Images.Add(Resources.product);
- imageItem.Images.Add(Resources.report);
- imageItem.Images.Add(Resources.shop);
- imageItem.Images.Add(Resources.shopping);
- imageItem.Images.Add(Resources.sms);
- imageItem.Images.Add(Resources.smstmp);
- imageItem.Images.Add(Resources.table);
- imageItem.Images.Add(Resources.table_excel);
- imageItem.Images.Add(Resources.telephone);
- imageItem.Images.Add(Resources.vcard_add);
- imageItem.Images.Add(Resources.weixin);
- imageItem.Images.Add(Resources.xtgg);
- #endregion
- LvArea.StateImageList = imageItem;
- LvArea.LargeImageList = imageItem;
- }
- /// <summary>
- /// 初始化导航条
- /// </summary>
- private void InitializeControl()
- {
- //
- // 导航条上的标题栏
- //
- TitleBar.Cursor = Cursors.Hand;
- TitleBar.TextAlign = ContentAlignment.MiddleCenter;
- TitleBar.ForeColor = Color.FromArgb(, , );
- TitleBar.Location = , );
- TitleBar.Size = , );
- TitleBar.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
- TitleBar.BackgroundImage = Resources.img2;
- //顶级菜单按钮事件
- TitleBar.Click += new EventHandler(TitleBar_Click);
- //
- //ButtonGroup导航条
- //
- Width = ;
- Height = ;
- this.Controls.Add(TitleBar);
- this.Controls.Add(LvArea);
- }
- /// <summary>
- /// 初始化菜单二级子项
- /// </summary>
- public void InitImageButtons(int ParentHeight,int ParentCount,List<MenuTable> GetCurrentMenuTable)
- {
- //获取菜单顶级控件的高度
- int imageButtonHeight = ParentHeight;
- //
- // 导航条上的面板区域(Panel)
- //
- LvArea.Location = , );
- //子面板的高度 等于顶级面板的高度-导航条的高度 30* 导航条的个数 高度不足则显示下拉框
- LvArea.Size = , imageButtonHeight - (ParentCount * ));
- LvArea.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
- LvArea.View = View.Tile;
- LvArea.SelectedIndexChanged += new EventHandler(LvArea_SelectedIndexChanged);
- // 导航条上的图片按钮
- //
- ListViewItem item = null;
- ; n < ImageButtons.Count; n++)
- {
- ).FirstOrDefault()!=null)
- {
- item = new ListViewItem(ImageButtons[n].Text, ImageButtons[n].imageIndex);
- LvArea.Items.Add(item);
- }
- }
- LvArea.Scrollable = true;
- LvArea.Cursor = Cursors.Hand;
- }
- private System.Windows.Forms.Label TitleBar = new System.Windows.Forms.Label();
- private ListView LvArea = new ListView();
- private ImageList imageItem = new ImageList();
- /// <summary>
- /// 导航条上的标题栏的文字
- /// </summary>
- public new String Text
- {
- get
- {
- return TitleBar.Text;
- }
- set
- {
- TitleBar.Text = value;
- }
- }
- public string tagText
- {
- get;
- set;
- }
- private List<NarBarItem> _ImageButtons = new List<NarBarItem>();
- /// <summary>
- /// 导航条所包含或关联的二级菜单
- /// </summary>
- public List<NarBarItem> ImageButtons
- {
- get { return _ImageButtons; }
- set
- {
- _ImageButtons = value;
- }
- }
- /// <summary>
- /// 单击导航条上的标题事件处理
- /// </summary>
- private void TitleBar_Click(object sender, EventArgs e)
- {
- if (TitleBarClick != null)
- {
- TitleBarClick(this, e);
- }
- }
- /// <summary>
- /// 二级分类的点击事件
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void LvArea_SelectedIndexChanged(object sender, EventArgs e)
- {
- )
- {
- ListView.SelectedIndexCollection c = LvArea.SelectedIndices;
- tagText = LvArea.Items[c[]].Text;
- if (ImageButtonClick != null)
- {
- ImageButtonClick(sender, tagText);
- }
- }
- }
- }
步骤五:用户控件Cs 代码中相关的方法代码如下
- public partial class NavBar : UserControl
- {
- ;
- public NavBar()
- {
- InitializeComponent();
- int SH = Screen.PrimaryScreen.Bounds.Height;
- NavBarHeight = SH - ;
- InitNavBar(); // 初始化导航栏,该方法必须在NavButtonGroup重新调整后执行
- }
- /// <summary>
- /// 窗体改变大小后重新计算排版控件
- /// </summary>
- public void NarBarSizeChange()
- {
- int SH = Screen.PrimaryScreen.Bounds.Height;
- NavBarHeight = SH - ;
- ResetNavBar();
- }
- #region 定义显示菜单
- /// <summary>
- /// 说明:导航栏初始的功能模块列表,可以通过定义此列表设置导航栏中的导航条及图片按扭。
- /// 注意:这里定义的是一个私有的List类型变量NavButtonGroup,并不是一个私有的函数方法。
- /// </summary>
- private List<NavBar.ButtonGroup> NavButtonGroup = new List<NavBar.ButtonGroup>()
- {
- new ButtonGroup("前台销售")
- {
- ImageButtons = new List<NarBarItem>()
- {
- ),
- ),
- ),
- ),
- ),
- }
- },
- new ButtonGroup("进货管理")
- {
- ImageButtons = new List<NarBarItem>()
- {
- ),
- ),
- }
- }
- ,
- new ButtonGroup("销售管理")
- {
- ImageButtons = new List<NarBarItem>()
- {
- ),
- ),
- }
- }
- ,
- new ButtonGroup("库存管理")
- {
- ImageButtons = new List<NarBarItem>()
- {
- ),
- ),
- ),
- }
- }
- ,
- new ButtonGroup("报表中心")
- {
- ImageButtons = new List<NarBarItem>()
- {
- ),
- ),
- ),
- ),
- ),
- ),
- ),
- ),
- ),
- ),
- }
- }
- ,
- new ButtonGroup("会员管理")
- {
- ImageButtons = new List<NarBarItem>()
- {
- ),
- ),
- ),
- ),
- ),
- }
- }
- ,
- new ButtonGroup("数据分析")
- {
- ImageButtons = new List<NarBarItem>()
- {
- ),
- ),
- ),
- ),
- ),
- ),
- ),
- }
- }
- ,
- new ButtonGroup("短信管理")
- {
- ImageButtons = new List<NarBarItem>()
- {
- ),
- ),
- ),
- ),
- }
- }
- ,
- new ButtonGroup("员工管理")
- {
- ImageButtons = new List<NarBarItem>()
- {
- ),
- ),
- ),
- ),
- }
- }
- ,
- new ButtonGroup("商品管理")
- {
- ImageButtons = new List<NarBarItem>()
- {
- ),
- ),
- ),
- ),
- }
- }
- ,
- new ButtonGroup("系统设置")
- {
- ImageButtons = new List<NarBarItem>()
- {
- ),
- ),
- ),
- ),
- }
- }
- ,
- new ButtonGroup("系统帮助")
- {
- ImageButtons = new List<NarBarItem>()
- {
- ),
- ),
- ),
- }
- }
- };
- #endregion
- private List<MenuTable> GetCurrentUserMenuTable = new List<MenuTable>();
- /// <summary>
- /// 取得当前用户的菜单权限
- /// </summary>
- private void GetCurrentUserMenu()
- {
- MenuBLL bll = new MenuBLL();
- List<MenuTable> getAllMenuTable = bll.ToList();
- List<MenuTable> getCurrentMenuTable = new List<MenuTable>();
- //绑定数据库所有的菜单
- if (Current.IsAdmin)
- {
- getCurrentMenuTable = getAllMenuTable.OrderBy(p => p.fOrder).ToList();
- GetCurrentUserMenuTable = getCurrentMenuTable;
- }
- else
- {
- //根据员工取得当前员工的菜单
- List<UsersPower> powerList = new UsersPowerBLL().ToList(Ugong.WinUtility.Utility.fCustID, Current.UserID);
- List<MenuTable> MenuList = new List<MenuTable>();
- MenuTable MenuModel = new MenuTable();
- foreach (UsersPower item in powerList)
- {
- MenuModel = getAllMenuTable.Where(p => p.fID == item.fMenuID).FirstOrDefault();
- if (MenuModel == null) continue;
- MenuList.Add(MenuModel);
- }
- getCurrentMenuTable = MenuList.OrderBy(p => p.fOrder).ToList();
- GetCurrentUserMenuTable = getCurrentMenuTable;
- }
- //剔除当前用户没有的一级菜单
- MenuTable model = null;
- List<NavBar.ButtonGroup> temBtnGroup = new List<NavBar.ButtonGroup>();
- foreach (NavBar.ButtonGroup ul in NavButtonGroup)
- {
- model = getCurrentMenuTable.Where(p => p.fMenuName == ul.Text && p.fParentID == ).FirstOrDefault();
- if (model != null)
- {
- temBtnGroup.Add(ul);
- }
- }
- NavButtonGroup = temBtnGroup;
- }
- #region 导航栏类中的相关属性与方法
- public delegate void ButtonClickHander(object sender, string targetModule);
- /// <summary>
- /// 自定义从二级子项返回的委托
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="targetModule"></param>
- public delegate void NavBarClikHander(object sender, string targetModule);
- /// <summary>
- /// 自定义从二级子菜单返回的事件
- /// </summary>
- public event NavBarClikHander NavBarClick;
- /// <summary>
- /// 退出
- /// </summary>
- public event EventHandler QuitSystemClick;
- /// <summary>
- /// 初始化导航栏
- /// </summary>
- private void InitNavBar()
- {
- GetCurrentUserMenu();
- this.Dock = DockStyle.Fill;
- ; n < NavButtonGroup.Count; n++)
- {
- ButtonGroup buttonGroup = NavButtonGroup[n];
- buttonGroup.Left = ;
- buttonGroup.Tag = n;
- buttonGroup.TitleBarClick += new EventHandler(TitleBar_Click);
- buttonGroup.InitImageButtons(NavBarHeight, NavButtonGroup.Count,GetCurrentUserMenuTable); //初始化子控件
- buttonGroup.ImageButtonClick += new ButtonClickHander(buttonGroup_ImageButtonClick);
- PnlBackGround.Controls.Add(buttonGroup); //将菜单控件添加到用户模板的顶级控件中
- }
- //对控件进行布局
- ResetNavBar();
- }
- /// <summary>
- /// 二级菜单事件升级到顶级事件
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="targetModule"></param>
- void buttonGroup_ImageButtonClick(object sender, string targetModule)
- {
- if (NavBarClick != null)
- {
- NavBarClick(sender, targetModule);
- }
- }
- /// <summary>
- /// 重新设置导航栏的布局。
- /// </summary>
- private void ResetNavBar()
- {
- ;
- ; n < NavButtonGroup.Count; n++)
- {
- ButtonGroup buttonGroup = NavButtonGroup[n];
- if (n <= CurrentGroupIndex)
- {
- buttonGroup.Top = + n * barHeight;
- }
- else
- {
- buttonGroup.Top = PnlBackGround.Height - (NavButtonGroup.Count - n) * barHeight;
- }
- if (n == CurrentGroupIndex)
- {
- buttonGroup.Height = PnlBackGround.Height - (NavButtonGroup.Count - ) * barHeight;
- }
- else
- {
- buttonGroup.Height = barHeight;
- }
- }
- }
- /// <summary>
- /// 导航条大小发生变更时,重新设置导航条的布局。
- /// </summary>
- private void NavBar_SizeChanged(object sender, EventArgs e)
- {
- ResetNavBar();
- }
- /// <summary>
- /// 当前导航栏中选中的导航条编号
- /// </summary>
- ;
- /// <summary>
- /// 导航栏中的导航条单击事件处理
- /// </summary>
- private void TitleBar_Click(object sender, EventArgs e)
- {
- if (sender is ButtonGroup)
- {
- ButtonGroup buttonGroup = (ButtonGroup)sender;
- if (buttonGroup.Text == "退出系统")
- {
- if (QuitSystemClick != null)
- {
- QuitSystemClick(buttonGroup, e);
- }
- return;
- }
- CurrentGroupIndex = (int)buttonGroup.Tag;
- ResetNavBar();
- }
- }
- #endregion
- }
步骤六:在页面的调用方法
- public FrmMain2()
- {
- InitializeComponent();
- navBar1.NavBarClick += new UserControls.NavBar.NavBarClikHander(navBar1_NavBarClick);
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void FrmMain_Resize(object sender, EventArgs e)
- {
- navBar1.NarBarSizeChange();
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="targetModule"></param>
- void navBar1_NavBarClick(object sender, string targetModule)
- {
- if (!string.IsNullOrEmpty(targetModule))
- {
- targetModule //
- }
- }
好了 帖出了全部代码就不用提供示例下载了.
Winfrom 开发系统导航菜单的更多相关文章
- SharePoint开发 - 自定义导航菜单(一)菜单声明与配置
博客地址 http://blog.csdn.net/foxdave 本篇描述自定义sharepoint菜单的一种方式,自定义菜单适用于一些门户等需求的网站 自定义的菜单有自己的数据源,可以是数据表,可 ...
- netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源
AntMgr https://github.com/yuzd/AntMgr 基于netcore2.0 mvc 开发的 快速搭建具有如下特色的后台管理系统 特色: 用户管理 菜单管理 角色管理 权限管理 ...
- SharePoint开发 - 自定义导航菜单(二)母版页的菜单应用
博客地址 http://blog.csdn.net/foxdave 接上篇点击打开链接 本篇叙述在母版页中应用之前的配置信息生成菜单,主要涉及到母版页的自定义,并应用了第三方控件库DevExpress ...
- SharePoint开发 - 自定义导航菜单(三)附其他代码
博客地址 http://blog.csdn.net/foxdave 接上篇点击打开链接 LeftNavGroupTemplate.cs internal class LeftNavGroupTempl ...
- jquery实现的个人中心导航菜单
之前为大家介绍了一款jquery和css3实现的很酷的菜单导航.这是一款由jquery开发的导航菜单.适合放在门户网站的个人用户中心后台.效果和美观都非常不错.我们先一起看看效果图: 在线预览 源 ...
- 5.JavaScript优化及导航菜单背后的秘密
JavaScript优化及导航菜单背后的秘密 伍星 学习目标1.进一步了解前端优化 学习如何编写良好的 JavaScirpt2.通过导航的学习,了解JavaScirpt的应用 JavaScript在用 ...
- python测试开发django-41.crispy-forms设计标签式导航菜单(TabHolder)
前言 xadmin的详情页面主要是用form_layout布局,学会了完全可以不用写html代码,也能做出很好看的页面. xadmin的html页面是用的Bootstrap3框架设计的,layout布 ...
- Web前端开发实战6:CSS实现导航菜单结合二级下拉式菜单的简单变换
前面几篇博文都在讲导航菜单和二级下拉式菜单,事实上有非常多方法都能够实现的.详细的情况还要视情况而定. 在后面学习到jQuery框架之后,会有更丰富的动画效果.因为在学习Ajax和jQuery的初步阶 ...
- 使用jQuery开发iOS风格的页面导航菜单
在线演示1 本地下载 申请达人,去除赞助商链接 iOS风格的操作系统和导航方式现在越来越流行,在今天的jQuery教程中,我们将介绍如何生成一个iphone风格的菜单导航. HTML代码 我们 ...
随机推荐
- Silverlight弹出层(转载)
ChildWindow为Silverlight中的弹出子窗口 可以在项目新建子窗口文件: 相互传值: //父窗体向子窗体传值,需要在ChildWindow中构造函数进行传值ChildWindowTes ...
- JavaScript执行上下文
变量声明.函数声明为何会提升?js执行时是如何查找变量的?JavaScript中最基本的部分——执行上下文(execution context) 什么是执行上下文? 当JavaScript代码运行,执 ...
- java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁
1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数 ...
- Code::Blocks生成的EXE文件执行错误解决:The program can't start because libgcc_s_dw2-1.dll is missing
想用C++弄个简单东东,看有没有可行性, 开发软件,微软的太大太肿,就选用了Code::Blocks. 测试HELLO时,在工程环境中没问题的,但生成的EXE执行有问题, 报什么 libgcc_s_d ...
- 29. 栈的push,pop序列
题目:给定2个整数序列,其中1个是栈的push顺序,判断另一个有没有可能是对应的pop顺序 解:其实这题主要是判断进栈次数和出栈次数誓不是相等.我是用栈作的,效率不高,每一个元素最多出栈1次,进栈1此 ...
- hdu1020 Encoding
http://acm.hdu.edu.cn/showproblem.php?pid=1020 过了的就是好孩子........ #include<stdio.h> #include< ...
- MAC OS JAVA环境变量配置
在 /etc/profile 中 加上这些 #临时提权 sudo su #输入密码 vi /etc/profile #配置JAVA_HOME,此处路径根据自己的版本填写 JAVA_HOME=&quo ...
- kmalloc/kfree,vmalloc/vfree函数用法和区别
http://blog.csdn.net/tigerjibo/article/details/6412881 kmalloc/kfree,vmalloc/vfree函数用法和区别 1.kmalloc ...
- c/c++优秀博文
C进阶指南(1):整型溢出和类型提升.内存申请和管理 http://blog.jobbole.com/72830/ 软件开发中应避免的10个问题
- 发送消息执行记事本的“另存为”菜单功能(通过WM_COMMAND控制使用别的程序的菜单命令)
发送消息执行记事本的“另存为”菜单功能procedure TForm1.FormCreate(Sender: TObject);var hNotepad: Cardinal;begin hNotepa ...