1.0 添加学员界面设计
右键添加“windows窗体,窗体功能组件一般用“Frm”开头。
” image.png,
当前项目结构如下:
image.png
同时设置一些页面的属性:
this.MaximizeBox = false;
this.Text = "【添加新学员】";
最终效果如下:
image.png
首先是一个label控件,设置字体大小为二号的微软雅黑,颜色设置为紫色,text
改为“添加新学员”。
然后添加一个
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
最后弄好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
为了达到关闭的效果,首先修改
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
网友评论