【Windows Form 实战】学生成绩管理系统(四) 登录模块设计

登录Form

frmLogin.cs


两个Textbox控件:tbUserID, tbPassword
一个按钮:btnLogin

双击登录按钮,进入代码编辑界面:
用如下代码覆盖当前界面代码:

using System;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace SSMS
{
    public partial class frmLogin : Form
    {
        public frmLogin()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(Data.connectionString);
            con.Open();
            MessageBox.Show(con.State.ToString());
        }
    }
}

注:Sqlconnection 对应的程序包是 System.Data.SqlClient。

先用这个代码测试一下数据库连接是否成功,运行程序,点击登录按钮,如果显示如下,就说明连接成功了:

如果失败了的话,原因只可能是connectionString不正确,参考我前面的说明。

成功了的话,继续,修改btnLogin_Click事件如下:

private void btnLogin_Click(object sender, EventArgs e)
{
    if (tbUserID.Text == "" || tbPassword.Text == "")
    {
        MessageBox.Show("用户名或密码不能为空");
    }
    else
    {
        SqlConnection con = new SqlConnection(Data.connectionString);
        con.Open();
        string sqlStr = @"select * from {0} 
                        where {1}='{2}' and {3}='{4}'";
        sqlStr = String.Format(sqlStr, Data.t_login, Data.c_login_username, tbUserID.Text, Data.c_login_password, tbPassword.Text);

        SqlCommand cmd = new SqlCommand(sqlStr, con);
        SqlDataReader dataReader = cmd.ExecuteReader();
        if (dataReader.HasRows)
        {
            MessageBox.Show("登录成功");
        }
        else
        {
            MessageBox.Show("登录失败");
        }
        con.Close();
    }
}

运行程序,用我们之前往Login表里添加的数据测试,
用户名:1 密码:1 点击登录,弹出一个登录成功的提示。

sqlStr:一个简单的SQL查询语句,之所以用这种传参数的办法填充这个语句,是为了避免SQL注入。将输入的用户名、密码放到Login表中去比对,有的话就登录成功了。

下面再进一步完善,登陆成功直接跳转到相应界面。

private void btnLogin_Click(object sender, EventArgs e)
{
    ...前面代码省略
    if (dataReader.HasRows)
    {
        dataReader.Read();
        string role = dataReader[Data.c_login_role].ToString().Trim();
        Data.loginID = tbUserID.Text;
        switch (role)
        {
            case "admin":
                frmAdmin afrmAdmin = new frmAdmin();
                afrmAdmin.Show();
                this.Hide();
                break;
            case "teacher":
                frmTeacher afrmTeacher = new frmTeacher();
                afrmTeacher.Show();
                this.Hide();
                break;
            case "student":
                frmStudent afrmStudent = new frmStudent();
                afrmStudent.Show();
                this.Hide();
                break;
            default:

                break;
        }
    }
    else
    {
        MessageBox.Show("登录失败");
    }
    con.Close();
    ...后面大括号自己补全注意匹配
}

运行,用户名、密码还是1,登录,跳转到管理员界面,一个还没有添加内容的form:

关闭这个form。似乎我们成功实现了跳转。但其实这个进程根本没有彻底结束,它依然潜伏在后台运行着,不行我们打开任务管理器>进程,找到这个进程:

为了进一步验证我们的猜想,我么 再运行一次程序,然后再关掉,此时又会多了一个SSMS的进程:

为什么会这样呢?原因其实很简单,this.Hide(); 而不是this.close()。由于程序是从frmLogin这个form启动的,所以要结束整个Application,必须彻底关闭frmLogn才行。解决办法如下(先在任务管理器结束SSMS.exe进程):

第一步:修改frmLogin的btnLogin_Click事件:

private void btnLogin_Click(object sender, EventArgs e)
{
    ...
    if (dataReader.HasRows)
    {
        dataReader.Read();
        string role = dataReader[Data.c_login_role].ToString().Trim();
        Data.loginID = tbUserID.Text;
        switch (role)
        {
            case "admin":
                frmAdmin afrmAdmin = new frmAdmin(this);
                afrmAdmin.Show();
                this.Hide();
                break;
            case "teacher":
                frmTeacher afrmTeacher = new frmTeacher(this);
                afrmTeacher.Show();
                this.Hide();
                break;
            case "student":
                frmStudent afrmStudent = new frmStudent(this);
                afrmStudent.Show();
                this.Hide();
                break;
            default:

                break;
        }
    }
    else
    {
        MessageBox.Show("登录失败");
    }
    con.Close();
    ...
}

第二步:修改frmAdmin.cs

首先用如下代码覆盖原有代码,然后在
选中frmAdmin的设计界面,右键>属性>事件>FormClosing事件:


然后绑定frmAdmin_FormClosing方法。

using System.Windows.Forms;

namespace SSMS
{
    public partial class frmAdmin : Form
    {
        frmLogin myLoginForm;
        public frmAdmin(frmLogin afrmLogin = null)
        {
            myLoginForm = afrmLogin;
            InitializeComponent();
        }

        private void frmAdmin_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (myLoginForm != null)
            {
                myLoginForm.Close();
            }
        }
    }
}

第三步:修改frmStudent.cs 原理同上

using System.Windows.Forms;

namespace SSMS
{
    public partial class frmStudent : Form
    {
        frmLogin myLoginForm;
        public frmStudent(frmLogin afrmLogin = null)
        {
            myLoginForm = afrmLogin;
            InitializeComponent();
        }

        private void frmStudent_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (myLoginForm != null)
            {
                myLoginForm.Close();
            }
        }
    }
}

第四步:修改frmTeacher.cs(同理,略)

源代码文件下载地址

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值