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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 白盒测试技术_静态白盒测试

    白盒测试技术_静态白盒测试覆盖率 它是度量测试完整性的一个工具,通常可以分为逻辑覆盖和功能覆盖。覆盖率=(被执行到的项数/总项数)*100%逻辑覆盖 逻辑覆盖是以程序内部的逻辑结构为基础设计测试用例的技术,属于白盒测试。      被测试模块的流程图语句覆盖 设计若干测试用例,运行被测程序,使每个可执行语句至少执行一次。 语句覆盖率=被评价到的语句数量/

    2025年11月29日
    7
  • 卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!

    卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!作者|Rocky0429来源|Python空间大家好,我是Rocky0429,一个喜欢在网上收集各种资源的蒟蒻…网上资源眼花缭乱,下载的方式也同样千奇百怪,比如BT下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的x雷和某度网盘成了我经常使用的工具。作为一个没有钱的穷鬼,某度网盘几十kb的下载速度让我…

    2022年6月14日
    34
  • pycharm自动退出_pycharm怎么debug

    pycharm自动退出_pycharm怎么debug起因:今天在学习py的时候,学到了numpy以及pandas,然后我的pycharm莫名其妙就进入了一个啥啥科学模式,就是执行代码都在pythonConsole里面去了,原谅小白不懂这玩意。。。然后怎么也回不到过去了!!!小白都惊呆了,这可咋整。。于是去求助开发大佬~得到解决方法如下:Settings–>Tools–>PythonScientific>Showplotsintoolwindow取消勾选View取消勾选ScientificMode

    2022年8月25日
    6
  • rsync文件实时同步命令_sshcopyid命令详解

    rsync文件实时同步命令_sshcopyid命令详解简介  最近有一个比较特殊的需求需要实现,某个服务提供文件上传服务。但是要解决单点问题,所以会程序会部署在多台服务器上。但是也会随之带来一个和共享cookie的问题,那就是文件存储也应该共享的.其实大部分同学想到的,第一个肯定是使用NFS来解决。大家通过NFSmount到同一个目录即可实现.但是为什么我们没有选择这个解决方案呢?那是因为之前不知道是我们使用不当还是NFS自身存在问题,出现了几次事故,NFSServer端卡死,导致整个NFS的client端由于使用硬挂载的方式一

    2022年10月13日
    3
  • 【Android】PreferenceFragment「建议收藏」

    【Android】PreferenceFragment「建议收藏」调用PreferenceFragment类出错,用了我三天时间才搞定,查官方文档,看百度最后在这位大佬的帖子帮助下终于搞定了。https://blog.csdn.net/cqx13763055264/article/details/78498419#commentBoxPreferenceActivity创建和使用比较复杂,Android官方现在不建议使用了,使用Preferenc…

    2025年8月28日
    8
  • mac idea jrebel 激活

    mac idea jrebel 激活jrebel 官网提供注册 然后会给你一个注册码首先 idea 安装 jrebel 在安装完成之后 点击以下按钮一开始跟我的不一样 我的是注册完成之后 才会显示 Changelicens 的这个提示 之前好像是 Activatenow 提示 点击即可当注册完成之后 关闭弹出框选择上图中的值 去官网注册 https zeroturnarou com

    2026年1月16日
    16

发表回复

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

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