【C#与.net】9.0 学生管理系统开发-添加学员业务、子窗口嵌入父窗口

1.0 添加学员界面设计

右键添加“windows窗体,窗体功能组件一般用“Frm”开头。

image.png

当前项目结构如下:

image.png

同时设置一些页面的属性:
this.MaximizeBox = false;
  this.Text = "【添加新学员】";

最终效果如下:

image.png

首先是一个label控件,设置字体大小为二号的微软雅黑,颜色设置为紫色,text改为“添加新学员”。

image.png

然后添加一个 PictureBox控件。设置一下边框。
image.png

然后按住ctrl键鼠标拖动,弄出来2个框。
image.png

然后弄出来4个Button控件:
image.png

下面是弄出需求中的“学员基本信息”区域,这里通过 GroupBox进行统一管理。
image.png
GroupBox不仅能让控件使用起来非常方便,还能在整体移动的时候可以借助它进行操作。就相当于一个集合。
然后交替使用label、textBox控件设计页面。
image.png

单选使用RadioBox,下拉框用的ComboBox,日期通常使用DateTimePicker,日期我喜欢用横杠。只需要设置如下两个参数即可:

image.png
image.png

最终效果如下:
image.png

最后弄好2个按钮,微调一下则可达到最终效果。
2.0 子窗口嵌入父窗口

在父页面编辑“添加学员”按钮,将name属性改为“btnAddStudent”,双击按钮即可新增点击事件监听方法:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace StudentManagerPro
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        private void btnAddStudent_Click(object sender, EventArgs e)
        {

        }
    }
}

最简单的相应方式就是弹窗弹出:

private void btnAddStudent_Click(object sender, EventArgs e)
        {

            FrmAddStudent frmAddStudent = new FrmAddStudent();
            frmAddStudent.Show();
        }

运行如下:

image.png

为了达到想要的效果,代码如下:

private void btnAddStudent_Click(object sender, EventArgs e)
        {
            FrmAddStudent frmAddStudent = new FrmAddStudent();
            frmAddStudent.TopLevel = false;//将子窗体设置成非顶级控件
            frmAddStudent.WindowState = FormWindowState.Maximized;//让子窗体最大化(使用了一个枚举类)
            frmAddStudent.FormBorderStyle = FormBorderStyle.None;//去掉窗体的边框
            frmAddStudent.Parent = this.spContainer.Panel2;//指定子窗体显示的容器
            frmAddStudent.Show();
        }

其中绑定的父容器,我们在写之前可以修改一下name属性。

image.png

执行效果如下:
image.png

为了达到关闭的效果,首先修改 name属性,然后再新增点击事件监听方法:
image.png
private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

这是会出现一个问题:多次点击“添加学员”,会反复弹出多个窗体。此时的设计思路是点击某个窗体应该把前面一个窗体关闭。(同一个窗体其实是实现刷新的功能)

代码实现思路就是在显示下一个窗体之前,将已有的所有窗体删除。代码如下:

private void btnAddStudent_Click(object sender, EventArgs e)
        {

            //嵌入窗体之前,首先判断当前容器中是否已经存在窗体
            //只要是容器  都有Controls集合
            foreach (Control item in this.spContainer.Panel2.Controls)
            {
                //Form:窗体的一个父类
                if (item is Form)
                {
                    //如果是,将控件转换为窗体类
                    Form frm = (Form)item;
                    frm.Close();
                }
            }

            FrmAddStudent frmAddStudent = new FrmAddStudent();
            frmAddStudent.TopLevel = false;//将子窗体设置成非顶级控件
            frmAddStudent.WindowState = FormWindowState.Maximized;//让子窗体最大化(使用了一个枚举类)
            frmAddStudent.FormBorderStyle = FormBorderStyle.None;//去掉窗体的边框
            frmAddStudent.Parent = this.spContainer.Panel2;//指定子窗体显示的容器
            frmAddStudent.Show();
        }

第三个问题,比方说,在首页“学员管理”按钮(name属性为btnStuManage) ,新增点击事件,按如上的方案,则会出现另一个监听事件需要写一遍类似的代码:

private void btnAddStudent_Click(object sender, EventArgs e)
        {

            //嵌入窗体之前,首先判断当前容器中是否已经存在窗体
            //只要是容器  都有Controls集合
            foreach (Control item in this.spContainer.Panel2.Controls)
            {
                //Form:窗体的一个父类
                if (item is Form)
                {
                    //如果是,将控件转换为窗体类
                    Form frm = (Form)item;
                    frm.Close();
                }
            }

            FrmAddStudent frmAddStudent = new FrmAddStudent();
            frmAddStudent.TopLevel = false;//将子窗体设置成非顶级控件
            frmAddStudent.WindowState = FormWindowState.Maximized;//让子窗体最大化(使用了一个枚举类)
            frmAddStudent.FormBorderStyle = FormBorderStyle.None;//去掉窗体的边框
            frmAddStudent.Parent = this.spContainer.Panel2;//指定子窗体显示的容器
            frmAddStudent.Show();
        }

        private void btnStuManage_Click(object sender, EventArgs e)
        {
            //嵌入窗体之前,首先判断当前容器中是否已经存在窗体
            //只要是容器  都有Controls集合
            foreach (Control item in this.spContainer.Panel2.Controls)
            {
                //Form:窗体的一个父类
                if (item is Form)
                {
                    //如果是,将控件转换为窗体类
                    Form frm = (Form)item;
                    frm.Close();
                }
            }

            FrmStuManage frmStuManage = new FrmStuManage();
            frmStuManage.TopLevel = false;//将子窗体设置成非顶级控件
            frmStuManage.WindowState = FormWindowState.Maximized;//让子窗体最大化(使用了一个枚举类)
            frmStuManage.FormBorderStyle = FormBorderStyle.None;//去掉窗体的边框
            frmStuManage.Parent = this.spContainer.Panel2;//指定子窗体显示的容器
            frmStuManage.Show();
        }

这样不仅代码累赘,而且也不符合面向对象编程思想。这里需要考虑代码的复用性。修改代码如下:

private void btnAddStudent_Click(object sender, EventArgs e)
        {

            closePerForm();//关闭已经存在的窗体
            openForm(new FrmAddStudent());//打开新的窗体
        }

        private void btnStuManage_Click(object sender, EventArgs e)
        {
            closePerForm();//关闭已经存在的窗体
         
        }


        #region 关闭前面的窗体,嵌入新窗体
        /// <summary>
        /// 关闭已经存在的窗体的通用方法
        /// </summary>
        private void closePerForm()
        {
            //嵌入窗体之前,首先判断当前容器中是否已经存在窗体
            //只要是容器  都有Controls集合
            foreach (Control item in this.spContainer.Panel2.Controls)
            {
                //Form:窗体的一个父类
                if (item is Form)
                {
                    //如果是,将控件转换为窗体类
                    Form frm = (Form)item;
                    frm.Close();
                }
            }
        }

        /// <summary>
        /// 打开窗体的通用方法
        /// </summary>
        /// <param name="form"></param>
        private void openForm(Form form)
        {
            form.TopLevel = false;//将子窗体设置成非顶级控件
            form.WindowState = FormWindowState.Maximized;//让子窗体最大化(使用了一个枚举类)
            form.FormBorderStyle = FormBorderStyle.None;//去掉窗体的边框
            form.Parent = this.spContainer.Panel2;//指定子窗体显示的容器
            form.Show();
        }
        #endregion

END

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值