OlympicManagementSystem项目目录
第一阶段
C#连接SQLServer数据库优雅方法(巨详细)
C# 登录功能(优雅且详细)
前言
此系列文章是有关贵州省第一届商务软件解决方案技能大赛试题的求解,下附试题以及项目源码。
在上一节中,我们完成了登录窗体的验证码,记住密码,记录用户登录类型等功能。本节中我们需要完成根据用户类型(RoleID)展现不同的页面。
一、需求描述
-
成功登录后,根据他们的角色跳转到不同的界面,在不同角色的主界面上显示不同的功能
按钮。
-
在点击每个页面的按钮时,跳转到对应的新页面,隐藏当前页面,例如:赛事管理员可以通过该界面管理运动项目,单击“Event Administrator Menu”界面中的 “Sport Management”按钮时,将会打开Sport Management界面。
-
在关闭子页面时,恢复显示当前被隐藏页面的内容
二、功能设计
1.窗体之间的结构设计
登录之后创建主窗体,主窗体中放置一个panel(panMain),窗体之间的切换全在主窗体panel(panMain)里面实现
蓝色窗体和橙色窗体都需要在主界面展示,所以在窗体结构上他们是同级关系
蓝色窗体需要给主窗体传值区分打开哪一个橙色子窗体
橙色窗体需要调用主窗体方法关闭自己并展示蓝色窗体
2.登录账号类型
在上一节中,我们在登录的同时获取了账号类型(RoleID)并储存在Appconfig文件中,我们只需要在主窗体中读取Appconfig的内容即可得到登录的用户信息
3.窗体界面设计
Main窗体(黑色窗体):
窗体中放置一个panel(panMain)
Menu窗体(蓝色窗体)以Event为例:
Sub窗体(橙色窗体)以Sport为例:
程序实现
Main窗体(黑色窗体):
根据RoleID创建对应窗体
private void LoadMenuForm(int role)//To load the menu form based on roleID, need to pass in roleID
{
switch (role)
{
case 0:
MessageBox.Show("获取RoleID失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
break;
case 1:
menuForm = new AffairsForm(this);
break;
case 2:
menuForm = new EventForm(this);
break;
case 3:
menuForm = new StatisticsForm();
break;
default:
MessageBox.Show("加载窗体未知错误", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
break;
}
menuForm.TopLevel = false;
menuForm.FormBorderStyle = FormBorderStyle.None;
menuForm.Dock = DockStyle.Fill;
this.panMain.Controls.Clear();
this.panMain.Controls.Add(menuForm);
menuForm.Show();
}
窗体加载的同时获取RoleID,调用创建窗体方法
private void Main_Load(object sender, EventArgs e)
{
//Read roleID from App.config and creat menuForm
Configuration cf = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
roleID = int.Parse(cf.AppSettings.Settings["roleID"].Value);
LoadMenuForm(roleID);
}
子窗体的创建以及关闭方法
public void LoadSubForm(Form form)//Load subForm, need to pass in Form object
{
subForm = form;
menuForm.Hide();
subForm.TopLevel = false;
subForm.FormBorderStyle = FormBorderStyle.None;
subForm.Dock = DockStyle.Fill;
this.panMain.Controls.Add(subForm);
subForm.Show();
}
public void CloseSubForm()//Close SubForm and show MenuForm
{
subForm.Close();
menuForm.Show();
}
Menu窗体(蓝色窗体):
此处以Event窗体为例
调用Main窗体的方法创建SubForm窗体
public void btnSport_Click(object sender, EventArgs e)//Load SportForm
{
SportForm sportForm = new SportForm(main);
main.LoadSubForm(sportForm);
}
private void btnCompetition_Click(object sender, EventArgs e)
{
CompetitionForm companieForm= new CompetitionForm(main);
main.LoadSubForm(companieForm);
}
Sub窗体(橙色窗体):
调用Main窗体的关闭Sub窗体函数
private void btnBack_Click(object sender, EventArgs e)
{
main.CloseSubForm();
}
完整代码
Main窗体:
using OlympicManagementSystem.Util;
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;
using Microsoft.Data.SqlClient;
using OlympicManagementSystem.Util;
using System.Configuration;
using OlympicManagementSystem.Forms;
namespace OlympicManagementSystem
{
public partial class Main : Form
{
int roleID = 0;
Form menuForm = new Form();
Form subForm = new Form();
public Main()
{
InitializeComponent();
}
private void Main_Load(object sender, EventArgs e)
{
//Read roleID from App.config and creat menuForm
Configuration cf = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
roleID = int.Parse(cf.AppSettings.Settings["roleID"].Value);
LoadMenuForm(roleID);
}
private void LoadMenuForm(int role)//To load the menu form based on roleID, need to pass in roleID
{
switch (role)
{
case 0:
MessageBox.Show("获取RoleID失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
break;
case 1:
menuForm = new AffairsForm(this);
break;
case 2:
menuForm = new EventForm(this);
break;
case 3:
menuForm = new StatisticsForm();
break;
default:
MessageBox.Show("加载窗体未知错误", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
break;
}
menuForm.TopLevel = false;
menuForm.FormBorderStyle = FormBorderStyle.None;
menuForm.Dock = DockStyle.Fill;
this.panMain.Controls.Clear();
this.panMain.Controls.Add(menuForm);
menuForm.Show();
}
public void LoadSubForm(Form form)//Load subForm, need to pass in Form object
{
subForm = form;
menuForm.Hide();
subForm.TopLevel = false;
subForm.FormBorderStyle = FormBorderStyle.None;
subForm.Dock = DockStyle.Fill;
this.panMain.Controls.Add(subForm);
subForm.Show();
}
public void CloseSubForm()//Close SubForm and show MenuForm
{
subForm.Close();
menuForm.Show();
}
}
}
Event窗体:
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 OlympicManagementSystem.Forms
{
public partial class EventForm : Form
{
private Main main;
public EventForm(Main mainForm)
{
InitializeComponent();
main=mainForm;
}
private void btnExit_Click(object sender, EventArgs e)
{
System.Environment.Exit(0);
}
public void btnSport_Click(object sender, EventArgs e)//Load SportForm
{
SportForm sportForm = new SportForm(main);
main.LoadSubForm(sportForm);
}
private void EventForm_Load(object sender, EventArgs e)
{
}
private void btnCompetition_Click(object sender, EventArgs e)
{
CompetitionForm competitionForm = new CompetitionForm(main);
main.LoadSubForm(competitionForm);
}
}
}
Sport窗体:
using OlympicManagementSystem.Model;
using OlympicManagementSystem.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OlympicManagementSystem.Util;
namespace OlympicManagementSystem.Forms
{
public partial class SportForm : Form
{
private Main main;
public SportForm(Main mainForm)
{
InitializeComponent();
main = mainForm;
}
private void btnBack_Click(object sender, EventArgs e)
{
main.CloseSubForm();
}
}
}
运行结果
登录Event管理员:
点击Sport按钮创建子页面:
点击返回关闭子页面,恢复menu页面:
后记
如果你这篇文章还不错的话,求点赞求收藏求转发,最重要的是你的支持是我做记录的最大动力,非常感谢!!!