您的位置:首页 > 其它

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

2016-01-03 16:41 761 查看

登录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(同理,略)

源代码文件下载地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: