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控件制作左侧导航菜单


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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • shell脚本运行jar包获取参数_linux加载一个目录下的所有jar包

    shell脚本运行jar包获取参数_linux加载一个目录下的所有jar包当使用SpringBoot框架时,他自己集成了tomcat。在启动jar包时,经常需要复制一大段命令,尤其是在项目目录发生改变的时候,实在繁琐。所以可以使用shell脚本来启动、关闭和重启Java项目。创建一个shell脚本vim脚本名.sh脚本内容:#!/bin/bash#这里可替换为你自己的执行程序,其他代码无需更改JAR_NAME=jar包名称#lib目录LOAD_PATH=”-Dloader.path=/home/local/lib/”#项目配置文件CONFIG_PATH

  • gimp中文版教程_GIMP中详细教程.pdf「建议收藏」

    gimp中文版教程_GIMP中详细教程.pdf「建议收藏」GIMP中详细教程GIMP实用系列教程1文件的打开和存储概述打开GIMP软件其初始界面如下:左边是工具,工具箱中每选择一种工具后,通常在其下部会出现一个与其相配的选项栏一起使用的。因此每选好一种工具,首先要把选项栏中的有关选项根据需要选定以后才开始使用。例如:图中选择了画笔,则画笔的选项栏可以选择其不透明度、画笔的笔尖形状、画笔的大小等选项。右边通常可以放置一个图层对话框,如未出现可以在下拉…

  • java中Set集合的遍历及实现类比较分析

    java中Set集合的遍历及实现类比较分析java中Set集合是一个不包含重复元素的Collection,首先我们先看看遍历方法packagecom.sort;importjava.util.HashSet;importjava.util.Iterator;importjava.util.Set;/***一个不包含重复元素的collection。更确切地讲,set不包含满足e1.equals(e2)的

  • 《书谱》(书法理论知识)

    ٩(๑•ㅂ•)۶  夫自古之善书者,汉魏有钟、张之绝,晋末称二王之妙。王羲之云:“顷寻诸名书,钟张信为绝伦,其余不足观。”可谓钟、张云没,而羲、献继之。又云:“吾书比之钟张,钟当抗行,或谓过之。张草犹当雁行。然张精熟,池水尽墨,假令寡人耽之若此,未必谢之。”此乃推张迈钟之意也。考其专擅,虽未果于前规;摭以兼通,故无惭于即事。  评者云:“彼之四贤,古今特绝;而今不逮古,古质而今研。”夫质以代兴,妍因俗易。虽书契之作,适以记言;而淳醨一迁,质文三变,驰鹜沿革,物理常然。贵能古不乖时,今不同弊,所谓“文质彬

  • 【Github教程】史上最全github用法:github入门到精通

    【Github教程】史上最全github用法:github入门到精通

    2021年11月29日
  • python怎么表示取余_python如何实现取余操作

    python怎么表示取余_python如何实现取余操作python实现取余操作的方法:可以利用求模运算符(%)来实现。求模运算符可以将两个数相除得到其余数。我们还可以使用divmod()函数来实现取余操作,具体方法如:【divmod(10,3)】。在python中要实现取余操作可以使用求模运算符(%),该运算符可以将两个数相除得到其余数。(推荐教程:Python入门教程)如果一个数恰好能被另外一个数据整除,则余数为0,%运算后返回结果为0。可利用余数…

发表回复

您的电子邮箱地址不会被公开。

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