学员管理系统(1)
2022-09-21 本文已影响0人
山猪打不过家猪
1. 项目要求

2. 项目搭建
2.1 添加两个类库DAL
和Models

-
添加完成后的项目结构
image.png
- 添加引用
因为DAL需要用到Models里的类,所以给DAL添加Models的引用;
展示层需要添加DAL和Models的引用
2.2 Models 层添加实体类
实体的字段和类型根据数据库的表一一对应

- 例
Admin.cs
namespace Models
{
class Admin
{
public int LoginId { get; set; }
public string LoginPwd { get; set; }
public string AdminName { get; set; }
}
}
- 添加完成后重新生成
注意:出现的问题,有两个引用的包版本低报错,如果项目中没有使用该引用,将报错的包直接删除即可 - 后期可以使用工具生成实体类
2.3 在DAL层添加数据访问类
主要写各个类的sql语句

- SqlHelper.cs需要添加
App.config
的引用
public class SqlHelper
{
/// <summary>
/// 必须和App.config里面的name一致
/// </summary>
public static string connString = ConfigurationManager.ConnectionStrings["connString"].ToString();
}
3.项目内容
3.1 用户登录
FrmUserLogin.cs
-
使用任何service的时候需要先实例化
image.png
- 封装登录输入的用户信息
//封装用户信息到用户对象
Admin objAdmin = new Admin()
{
LoginId = Convert.ToInt32(this.txtLoginId.Text.Trim()),
LoginPwd = this.txtLoginPwd.Text.Trim().ToString(),
};
- 提交用户,通过DAL判断用户是否正确
objAdmin = objAdminService.AdminLogin(objAdmin); //获取数据库信息,赋值给objAdmin
if (objAdmin == null)
{
MessageBox.Show("登录账号或密码错误");
}
else
{
//保存用户对象
Program.currentAdmin = objAdmin;
//设置窗体返回值
this.DialogResult = DialogResult.OK;
this.Close();
}
**注意:Program.currentAdmin
是全局变量,因为登录后以后改密码等操作会用到当前这个admin
//定义一个Admin全局变量,为以后使用该Admin做准备
public static Admin currentAdmin = null;
3.2 窗体的打开和关闭
private void ShowWindow(Form objForm)
{
//处理窗体重复,每个窗体都需要,所以可以设置成为一个方法
objForm.TopLevel = false;//将当前子窗体设置成非顶级
objForm.WindowState = FormWindowState.Maximized; //设置窗口最大化
objForm.FormBorderStyle = FormBorderStyle.None;
objForm.Parent = this.panelForm;//指定当前子窗体显示的容器
objForm.Show();
}
/// <summary>
/// 关闭窗体
/// </summary>
private void CloseWindow()
{
foreach (Control item in this.panelForm.Controls)
{
if (item is Form)
{
Form ojbControls = (Form)item;
ojbControls.Close();
this.panelForm.Controls.Remove(item);
}
}
}
3.3 修改密码
- 校验旧密码
这里就体现了前面全局变量currentAdmin
的作用
//判断两次新密码是否一致
if (this.txtNewPwd.Text.Trim() != this.txtNewPwdConfirm.Text.Trim())
{
MessageBox.Show("两次输入密码不同");
this.txtNewPwdConfirm.Focus();
this.txtNewPwdConfirm.SelectAll();
return;
}
- 将新密码提交到数据库
AdminService.cs
添加一个修改密码方法
//更新密码
int result = objAdminService.UpdatePwd(this.txtNewPwdConfirm.Text.Trim(), Program.currentAdmin.LoginId);
if (result == 1)
{
MessageBox.Show("新密码修改成功");
Program.currentAdmin.LoginPwd = this.txtNewPwdConfirm.Text.Trim();
this.Close();
}
3.4 使用泛型集合填充下拉框
StudentClassService.cs
返回一个包含全部Class的List
namespace DAL
{
public class StudentClassService
{
public List<StudentClass> GetClass()
{
string sql = "select ClassName,ClassId from StudentClass";
SqlDataReader objReader = SqlHelper.GetReader(sql);
List<StudentClass> classList = new List<StudentClass>();
while (objReader.Read())
{
classList.Add(
new StudentClass()
{
ClassId = Convert.ToInt32(objReader["ClassId"]),
ClassName = objReader["ClassName"].ToString()
}
); ;
}
objReader.Close();
return classList;
}
}
}
- 初始化下拉框
public FrmAddStudent()
{
InitializeComponent();
//初始化下拉框
this.cboClassName.DataSource = ojbSCS.GetAllClass();
this.cboClassName.DisplayMember = "ClassName";
this.cboClassName.ValueMember = "ClassId";
}
3.5 实现排序
//按照姓名降序
class NameDESC : IComparer<StudentExt>
{
public int Compare(StudentExt x, StudentExt y)
{
return y.StudentName.CompareTo(x.StudentName);
}
}
//
class IDDESC : IComparer<StudentExt>
{
public int Compare(StudentExt x, StudentExt y)
{
return y.StudentId.CompareTo(x.StudentId);
}
}
3.6 添加图片
private void btnChoseImage_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
DialogResult result = openFileDialog.ShowDialog();
if (result == DialogResult.OK)
{
this.pbStu.Image = Image.FromFile(openFileDialog.FileName);
}
}
3.7 添加学员
private void btnAdd_Click(object sender, EventArgs e)
{
//数据验证
//学员姓名验证
if (this.txtStudentName.Text.Trim().Length == 0 && this.txtStudentName.Text.Trim().Length > 18)
{
MessageBox.Show("请填写合法学员姓名!", "验证提示");
this.txtStudentName.Focus();
return;
}
//学员性别
if (!this.rdoMale.Checked && !this.rdoFemale.Checked)
{
MessageBox.Show("请选择性别");
return;
}
//验证省份证号
if (!DataValidate.IsIdentityCard(this.txtStudentIdNo.Text.Trim()))
{
MessageBox.Show("身份证不符合要求", "验证提示");
this.txtStudentIdNo.Focus();
this.txtStudentIdNo.SelectAll();
return;
}
//学员信息保存在数据库
//封装学员对象
Student objStudent = new Student()
{
StudentName = this.txtStudentName.Text.Trim(),
Birthday = Convert.ToDateTime(this.dtpBirthday.Text),
Age = DateTime.Now.Year - Convert.ToDateTime(this.dtpBirthday.Text).Year,
StuImage = this.pbStu.Image == null ? "" : new SerializeObjectToString().SerializeObject(this.pbStu.Image)
};
//提交
int result = objStudentService.AddStudent(ojbStudent);
//判断是否成功
if (result == 1)
{
}
}
3.7学员班级展示

- 首先,动态填充班级下拉框
public FrmStudentManage()
{
InitializeComponent();
//动态填充下拉框
this.cboClass.DataSource = objStuClassServicec.GetAllClass();
this.cboClass.DisplayMember = "ClassName";
this.cboClass.ValueMember = "ClassId";
this.cboClass.SelectedIndex = -1;
}
-
查询按钮
由于这里通过班级ID查询到每个学生信息和班级,但是原来的学生Models实体里面无学生班级,所以此时需要拓展一个ext类
image.png
namespace Models.Ext
{
/// <summary>
/// 学院信息扩展实体
/// </summary>
public class StudentExt : Student
{
public string ClassName { get; set; }
public string Csharp { get; set; }
public string SqlDB { get; set; }
public DateTime DTime { get; set; }
}
}
注意:每个类添加完成之后一定要记得加上访问级别public
或者private
,不然访问不到
StudentService.cs
namespace DAL
{
public class StudentService
{
public List<StudentExt> getStudentById(string classId)
{
string sql = "select StudentId,StudentName,Gender,Birthday,ClassName from Students";
sql += "inner join StudentClass on Students.ClassId = StudentClass.ClassId";
sql += "where StudentId =" + classId;
SqlDataReader objReader =SqlHelper.GetReader(sql);
List<StudentExt> list = new List<StudentExt>();
while (objReader.Read())
{
list.Add(new StudentExt()
{
StudentId = Convert.ToInt32(objReader["StudengId"]),
StudentName = objReader["StudentName"].ToString(),
Birthday = Convert.ToDateTime(objReader["Birthday"]),
ClassName = objReader["ClassName"].ToString()
});
}
objReader.Close();
return list;
}
}
}
- 展示
//按照班级查询
private void btnQuery_Click(object sender, EventArgs e)
{
List<StudentExt> list = objStudentService.getStudentById(this.cboClass.SelectedValue.ToString());
this.dgvStudentList.AutoGenerateColumns = false;//禁止生成不需要的列
this.dgvStudentList.DataSource = list;
}