【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(同理,略)
源代码文件下载地址相关文章推荐
- Hibernate之缓存,N+1
- Dungeon Master
- HTML使用<span>和<div>布局中遇到的问题
- SimpleAdapter gridView
- eval在MATLAB和Shell中的作用
- java解析和生成GSON串
- C++中的类模板详细讲述
- tbytes 转 十六进制 string
- Java学习----this和super(在继承中)
- Spark学习笔记
- Linux基本命令
- 在ORCAD里面如何给元器件自动编号
- bzoj 4373: 算术天才⑨与等差数列
- 三种方法实现Linux系统调用
- UML遗留问题总结
- 机器学习中的数学(1)-回归(regression)、梯度下降(gradient descent)
- 我为什么要写博客
- Swift控制手电筒操作(iOS)
- C语言写的控制台关机小程序
- 基于opencv的鼠标操作