C#窗体之间的切换,传值,调用的优雅方法

OlympicManagementSystem项目目录

第一阶段
C#连接SQLServer数据库优雅方法(巨详细)
C# 登录功能(优雅且详细)



前言

此系列文章是有关贵州省第一届商务软件解决方案技能大赛试题的求解,下附试题以及项目源码。

试题

项目源码

在上一节中,我们完成了登录窗体的验证码,记住密码,记录用户登录类型等功能。本节中我们需要完成根据用户类型(RoleID)展现不同的页面。


一、需求描述

  1. 成功登录后,根据他们的角色跳转到不同的界面,在不同角色的主界面上显示不同的功能
    按钮。
    Role ID及描述

  2. 在点击每个页面的按钮时,跳转到对应的新页面,隐藏当前页面,例如:赛事管理员可以通过该界面管理运动项目,单击“Event Administrator Menu”界面中的 “Sport Management”按钮时,将会打开Sport Management界面。
    Sport Management

  3. 在关闭子页面时,恢复显示当前被隐藏页面的内容

二、功能设计

1.窗体之间的结构设计

窗体结构
登录之后创建主窗体,主窗体中放置一个panel(panMain),窗体之间的切换全在主窗体panel(panMain)里面实现
蓝色窗体和橙色窗体都需要在主界面展示,所以在窗体结构上他们是同级关系
蓝色窗体需要给主窗体传值区分打开哪一个橙色子窗体
橙色窗体需要调用主窗体方法关闭自己并展示蓝色窗体

2.登录账号类型

账号类型
在上一节中,我们在登录的同时获取了账号类型(RoleID)并储存在Appconfig文件中,我们只需要在主窗体中读取Appconfig的内容即可得到登录的用户信息

3.窗体界面设计

Main窗体(黑色窗体)
窗体中放置一个panel(panMain)
Main
Menu窗体(蓝色窗体)以Event为例

Event
Sub窗体(橙色窗体)以Sport为例
Sub


程序实现

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管理员
event管理
点击Sport按钮创建子页面
sport
点击返回关闭子页面,恢复menu页面
在这里插入图片描述

后记

如果你这篇文章还不错的话,求点赞求收藏求转发,最重要的是你的支持是我做记录的最大动力,非常感谢!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值