winform菜单联动导航模板(treeView、UserControl)

起因:

           最近在做公司一个旧cs项目 技术栈是winform+sqlserver,我以前接触都是bs项目多,相对我来说还是比较新鲜的了,随着接触的越多发现遗留的坑不少呀我要新增一个页面对应一个新的菜单居然要修改好多代码,它这个项目菜单是项目启动时把一些对应关系都写到字典里了,新增后需要修改代码把你新增的页面添加到字典里和数据库里 而且不止一处实属有点难受。。。

做点什么把:

           你嫌人家的难受就自己写一个把,所以我写了一个菜单模板支持动态渲染再也不用手动修改代码拉;看下图是不是有点意思了:

都用了啥控件:

         Panel          =》用户各个功能块的布局

         UserControl =》自定义控件,主要做一级菜单的渲染工作

         TreeView     =》二级菜单展示 点击二级菜单导航到对应的窗体展示到右侧Panel

         DataGridView=》数据绑定并展示

都实现了啥功能:

        

1 动态渲染一级菜单;
2 点击一级菜单动态加载二级菜单;
3 点击二级菜单动态导航到对应form窗体show到右侧panel控件里;
4 页面加载后展示默认选中一级菜单、二级菜单;
4 展示患者信息页面数据;
5 开发中;

代码功能说明:       

项目目录:

Main:主页面

Resource:静态资源

UserControl:自定义用户组件

Model:数据模型

PatientForm:用户窗体

                 

菜单实现:

不展示所有代码拉

 // 1. 初始化二级菜单 后续可从数据库读取
            InitChildTilte();
            // 2. 动态创建一级菜单控件
            // 静态资源路径
            var resourceManager = Properties.Resources.ResourceManager;
            // 获取一级菜单背景panel 宽度
            var pannelWidth = this.panel2.Width;
            // 获取一级菜单数量
            int count = titleArray.Length;
            // 每个一级菜单的默认宽度
            int itemWidth = 82;
            // 计算每个一级菜单的间隔控件 求平均值
            int space = (pannelWidth - count * itemWidth) / (count + 1);
            int x = space;
            // 创建一级菜单对象
            foreach (string item in titleArray)
            {
                var pbox = new PictureBoxExtControl();
                // 动态设置动态背景图
                pbox.SetBackgroundImg((Bitmap)resourceManager.GetObject(item));
                // 设置菜单名称
                pbox.SetLableName(item);
                // 设置菜单位置
                pbox.SetLocation(new Point(x, 0));
                // 设置菜单尺寸
                pbox.SetSize(new Size(itemWidth, 70));
                // 绑定单机事件
                pbox.Click += pbox_Click;
                // 加入组件 便于后续设置选中状态
                boxList.Add(pbox);
                this.panel2.Controls.Add(pbox);
                // 计算下一个位置
                x += itemWidth + space;

     通过反射查找对应页面:

 // 1. 根据页面名称在程序集中查找页面类型
            Type formType = Assembly.GetExecutingAssembly().GetType("WindowsFormsApplication3." + node.Tag,false,true);
            if (formType != null && formType.IsSubclassOf(typeof(Form)))
            {
                // 2. 根据页面类型创建页面对象
                Form form = (Form)Activator.CreateInstance(formType);
                form.TopLevel = false;
                form.Dock = DockStyle.Fill;
                form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
                this.splitContainer1.Panel2.Controls.Add(form);
                form.Show();

            }
            else
            {
                // 3.无页面时显示文案提醒
                Label lbl =new Label();
                lbl.Text ="NOT FOUND PAGE";
                lbl.ForeColor = Color.Red;
                this.splitContainer1.Panel2.Controls.Add(lbl);
            }

展示效果:

最后:

一个比较粗糙的模板呀,代码太多就不依依展示了,代码后续我就上传了有需要的自取把;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值