C# WinForm开发系列之如何使用panel控件制作左侧导航菜单

C# WinForm开发系列之如何使用panel控件制作左侧导航菜单之前需要写一个C#的左侧导航菜单控件,想了许久,最终选择了使用paenl控件来实现这一功能。决定和大家分享一下,初步接触C#,欢迎多多指教,不胜感激!首先,我的思路分为以下几步:一.使用vs编辑工具创建一个导航菜单控件;如图1所示:图1二.在菜单控件上布局你的导航菜单控件的样式;其结构如图2所示,(我是通过5个panel控件和两个label控件组成):

大家好,又见面了,我是你们的朋友全栈君。

之前需要写一个C#的左侧导航菜单控件,想了许久,最终选择了使用paenl控件来实现这一功能。决定和大家分享一下,

初步接触C#,欢迎多多指教,不胜感激!

首先,我的思路分为以下几步:

一.使用vs编辑工具创建一个导航菜单控件;

如图1所示:

C# WinForm开发系列之如何使用panel控件制作左侧导航菜单

图1

二.在菜单控件上布局你的导航菜单控件的样式;

其结构如图2所示,(我是通过5个panel控件和两个label控件组成):

C# WinForm开发系列之如何使用panel控件制作左侧导航菜单

图2

控件制作效果如图3所示(需要注意的是将panel1,panel3,panel4的AutoSize属性设置为true,panel1,panel5的Dock属性设置为Top):

C# WinForm开发系列之如何使用panel控件制作左侧导航菜单

图3

三.代码实现菜单的循环生成(这其中主要有两个关键点:一是控件的复制,二是实现菜单点击事件的绑定和实现):

1.首先,我们可以先不考虑菜单数据来源,直接定义菜单的一级和二级数据,如:

 string[] arr;
 string[] childAry;
 arr = new string[] { “系统管理1”, “系统管理2”, “系统管理3”, “系统管理4”, “系统管理5”, };
 childAry = new string[] { “列表查看”, “添加页面”, “其他页面” };

2.然后我们首先循环一级菜单,每次循环需要复制一次panel1及其子控件并将一级菜单的菜单名赋值给当前复制的label控件。

与此同时,在每次一级菜单循环中都需要实现二级菜单的循环,并实现panel3及其子控件的复制和二级菜单名的赋值;代码如下

所示(ControlHelper为复制当前控件及其子控件的类):

 foreach (string menuAry in arr)
            {

                Control panel10 = ControlHelper.Clone(this.panel1, true) as Control;
                Control cp_ptLabel1 = panel10.Controls.Find(ptLabel1.Name, true)[0];
                Control cp_panel4 = panel10.Controls.Find(panel4.Name, true)[0];
                Control cp_panel3 = panel10.Controls.Find(panel3.Name, true)[0];

                cp_panel4.Controls.Clear();
                cp_ptLabel1.Text = menuAry;
                this.Controls.Add(panel10);
                panel10.BringToFront();

                panel10.Controls.Find(panel3.Name, true)[0].Visible = false;

                foreach (string childmenuary in childAry)
                {

                    Control cp_panel5 = ControlHelper.Clone(this.panel5, true) as Control;
                    Control cp_ptlabel2 = cp_panel5.Controls.Find(ptLabel2.Name, true)[0];
                    cp_ptlabel2.Text = childmenuary;
                    cp_panel4.Controls.Add(cp_panel5);
                    cp_panel5.BringToFront();
                }

}

注意:在循环生成菜单后需要利用控件的Visible进行隐藏初始菜单控件菜单项。

3.菜单点击事件的绑定(实现点击一级菜单时二级菜单的显示隐藏和二级点击时的页面展示)

 //    //一级菜单点击事件
               cp_ptLabel1.Click += delegate
               {

                  cp_panel3.Visible = !cp_panel3.Visible;
                };

            panel10.Controls.Find(panel2.Name, true)[0].Click += delegate
              {

                   cp_panel3.Visible = !cp_panel3.Visible;
               };

//    //一级菜单点击事件


//二级菜单点击事件
                    cp_ptlabel2.Click += delegate
                    {

                        int i = childAry.ToList().IndexOf(childmenuary);
                        string tName = arr1[i];
                        //方法一
                        Childmenuname.OnClick(tName);
                    };
                    cp_panel5.Click += delegate
                    {

                        int i = childAry.ToList().IndexOf(childmenuary);
                        string tName = arr1[i];
                        //方法一
                        Childmenuname.OnClick(tName);
                    };
//二级菜单点击事件


下面是点击事件的回调方法:

 //回调方法
        public interface ChildMenuName 
        {

            void OnClick(string name);
        }
        private ChildMenuName Childmenuname;

        public void SetName(ChildMenuName Childmenuname)
        {

            this.Childmenuname = Childmenuname;
        }
 //回调方法

4.关于点击在一个窗口左侧的导航菜单时,如何在该窗体内显示子窗体的问题.

可以在该窗体创建创建一个panel控件,在该panel内显示子窗体,如下:

UserForm UserForm = new UserForm();

//指示窗体显示是否为顶级窗口
UserForm.TopLevel = false;
this.pn_panel1.Controls.Add(UserForm);
UserForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
UserForm.Dock = System.Windows.Forms.DockStyle.Fill;
UserForm.Show();


三.下面是我把整个左侧导航菜单代码进行封装后的代码和调用代码:

1.调用代码(继承接口并实现方法和绑定需要的数据即可实现导航菜单的功能):

public partial class FormMain : Form, MenuTest.FormMain_Menu.ChildMenuName
{

        private DataTable mTable = null;     
        public FormMain()
        {

            InitializeComponent();
            this.LoadMenu();
            this.formMain_Menu2.SetName(this);
        }
        private void LoadMenu()
        {

                this.formMain_Menu2.MenuTable = null;
                this.formMain_Menu2.MenuClass = “MenuClass”;
                this.formMain_Menu2.ParentMenuList = “MenuPID”;
                this.formMain_Menu2.ChildMenuList = “MenuID”;
                this.formMain_Menu2.MenuName = “MenuName”;
                this.formMain_Menu2.MenuTable = mTable;
        }

        void FormMain_Menu.ChildMenuName.OnClick(string formName)
        {

            this.pn_panel1.Controls.Clear();
            Form frm = FormOpenHelper.ShowForm(formName);
            frm.Show();
            this.pn_panel1.Controls.Add(frm);                   
        }
}

2.封装后的导航菜单控件代码:

这里就省略了。。。。。。


最终效果如下图:

C# WinForm开发系列之如何使用panel控件制作左侧导航菜单

       

C# WinForm开发系列之如何使用panel控件制作左侧导航菜单


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159885.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • freeswitch笔记2:呼叫中心坐席转接

    freeswitch笔记2:呼叫中心坐席转接1.设置呼叫中心拨号计划<extensionname=”Call-Center-9999″continue=””uuid=”c3500cca-9d04-4e18-a857-9d54c7490038″> <conditionfield=”destination_number”expression=”^([^#]+#)(.*)$”break=”never”> <actionapplication=”set”data=”caller_id_name=$2″/&

    2022年7月27日
    4
  • ServletContextListener使用详解

    ServletContextListener使用详解在 ServletAPI 中有一个 ServletContextListener 接口,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期。当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理。在 ServletContextListene

    2022年4月29日
    41
  • java分布式(分布式架构)「建议收藏」

    java分布式(分布式架构)「建议收藏」【声明:版权所有,欢迎转载,请勿用于商业用途。联系信箱:feixiaoxing@163.com】开头的话,架构多半和业务关联在一起,如果只是简单的图书管理系统、选课系统或者什么简单的财务系统,用不着分布式。只有大型公司、高并发的业务才需要分布式的帮助。当然,架构本身要和业务模型紧密配合才能发挥作用。很长一段时间,java都是最流行的编程语言。我想,一方面…

    2022年4月30日
    80
  • 剑指Offer面试题:1.实现单例模式建议收藏

    一题目:实现单例模式Singleton只能生成一个实例的类是实现了Singleton(单例)模式的类型。由于设计模式在面向对象程序设计中起着举足轻重的作用,在面试过程中很多公司都喜欢问一些与设计模

    2021年12月19日
    43
  • http返回错误状态_状态码返回0

    http返回错误状态_状态码返回0状态码为405表示请求的方式不对,请求的方式有get、post、head、put……常用的为post和get。代码里面我刚刚开始的时候使用的是HttpPost发的请求,另外一边呢,刚刚开始的时候只有一个get请求在那等着呢。等我看到405之后,哦,类型,没对上,又在controller一边加了个post请求的这么一下就OK了。问题不大,简单记录一下。为的是下次…

    2025年8月3日
    2
  • ubuntu系统下mysql重置密码和修改密码操作

    ubuntu系统下mysql重置密码和修改密码操作一、忘记密码后想重置密码在介绍修改密码之前,先介绍一个文件/etc/mysql/debian.cnf.其主要内容如下图:里面有一个debian-sys-maint用户,这个用户只有Debian或Ubuntu服务器才有,所以如果您的服务器是Debain或Ubuntu,debian-sys-maint是个Mysql安装之后自带的用户,具体作用是重启及运行mysql服务。所以如果忘了root密码,可以通…

    2022年5月31日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号