以下是学习笔记:
一,用户登录逻辑实现
1,添加登录窗体和对应的实体类
2,用户登录逻辑分析
3,管理员数据访问类
namespace DAL { /// <summary> /// 管理员数据访问类 /// </summary> public class SysAdminService { /// <summary> /// 根据登录账号和密码登录 /// </summary> /// <param name="objAdmin">封装了登录账号和密码的管理员对象</param> /// <returns>返回包含管理员信息的对象</returns> public SysAdmin AdminLogin(SysAdmin objAdmin)//根据经验:返回值为实体类,参数也是实体对象,这样可以简化接口 { //组合SQL语句 string sql = "select AdminName from Admins where LoginId={0} and LoginPwd='{1}'";//值类型和字符串,字符串需要加单引号 sql = string.Format(sql, objAdmin.LoginId, objAdmin.LoginPwd);//解析对象,把对象的属性取出来 //从数据库中查询 SqlDataReader objReader = SQLHelper.GetReader(sql);//即使只有一个对象,也要返回一个结果集 if (objReader.Read())//因为只有返回只有一个对象,所以要用if。用where就太浪费了 { objAdmin.AdminName = objReader["AdminName"].ToString(); } else { objAdmin = null;//如果登录不成功,则将当前对象清空 } objReader.Close(); //返回结果 return objAdmin; } } }
4,登录界面:UI部分,点击事件
登录按钮事件:
private void btnLogin_Click(object sender, EventArgs e) { //【1】数据验证 if (this.txtLoginId.Text.Trim().Length == 0)//一定要用Trim() { MessageBox.Show("请输入登录账号!", "登录提示"); this.txtLoginId.Focus(); return; } if (this.txtLoginPwd.Text.Trim().Length == 0) { MessageBox.Show("请输入登录密码!", "登录提示"); this.txtLoginPwd.Focus(); return; } //【2】封装对象(实际封装的是用户登录账号和密码) SysAdmin objAdmin = new SysAdmin()//对象初始化器来初始化属性 { LoginId = Convert.ToInt32(this.txtLoginId.Text.Trim()), LoginPwd = this.txtLoginPwd.Text.Trim() }; //【3】和后台交互,判断登录信息是否正确 try { objAdmin = objAdminService.AdminLogin(objAdmin);//调用 数据访问类对象的方法 if (objAdmin != null)//如果登录成功 { //保存登录信息 Program.objCurrentAdmin = objAdmin;//在Program中创建的全局变量 public static Models.SysAdmin objCurrentAdmin = null; //设置登录窗体的返回值 this.DialogResult = DialogResult.OK; //关闭窗体 this.Close(); } else { MessageBox.Show("登录账号或密码有误!", "登录提示"); } } catch (Exception ex) { MessageBox.Show("数据访问出现异常,登录失败!具体原因:" + ex.Message); } }
5,登录成功后,在主界面显示 用户名
6,登录界面 改善用户体验(焦点切换和回车键自动登录)
#region 改善用户体验 private void txtLoginId_KeyDown(object sender, KeyEventArgs e) { if (e.KeyValue == 13) { if (this.txtLoginId.Text.Trim().Length != 0) { this.txtLoginPwd.Focus();//将当前的焦点跳转到密码框 } } } private void txtLoginPwd_KeyDown(object sender, KeyEventArgs e) { if (e.KeyValue == 13) { btnLogin_Click(null, null);//直接调用登录按钮的事件 } } #endregion