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代码 我们 ...
随机推荐
- Unity3D脚本中文系列教程(八)
◆ static var matrix : Matrix4x4 描述:设置用于渲染所有gizmos的矩阵. 类方法 ◆ Static function DrawCube(center:Vector3, ...
- Nginx配置一个自签名的SSL证书
http://www.liaoxuefeng.com/article/0014189023237367e8d42829de24b6eaf893ca47df4fb5e000 要保证Web浏览器到服务器的 ...
- 比較Backbone.js, Angular.js, Ember.js, Knockout.js 心得
還記得第一次寫網站的時候,我無意間寫成了 SPA(single page application),當時還沒有SPA這個詞,後來因為廣告主需要不同 url location 頁面的廣告展示,只好把部分 ...
- GOOGLE搜索秘籍完全公开
一,GOOGLE简介 Google(www.google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发明,Google Inc. 于19 ...
- Mininet 创建topo的时候指定host的ip
示例,要创建一个3个交换机8个主机的拓扑,如下图: 可以用如下python代码创建上述拓扑,并指定ip: from mininet.topo import Topo class MyTopo( Top ...
- Mysql 分页语句Limit用法
转载自:http://qimo601.iteye.com/blog/1634748 1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用 ...
- 【动态规划】流水作业调度问题与Johnson法则
1.问题描述: n个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工.每个作业加工的顺序都是先在M1上加工,然后在M2上加工.M1和M2加工作业i所需的时间分别为ai和bi ...
- python自省指南
深入python中对自省的定义: python的众多强大功能之一,自省,正如你所知道的,python中万物皆对象,自省是指代码可以查看内存中以对象形式存在的其他模块和函数,获取它们的信息,并对它们进行 ...
- python 利用imap接收邮件,并保存附件
def SaveAttachImap():# login the imap server ,retrive the new mails ,and download the attachments. ...
- Servlet小示例:jsp页面提交信息Servlet接收并打印输出
该示例采用doPost方法提交表单,该示例一共包含两个文件. 一个是用来提交用户信息的表单userForm2.jsp,另一个是用来接收参数的Servlet. userForm2.jsp <%@ ...