界面效果

练习重点

1. 关系表的创建

2. 增删改查的操作,及sqlhelper的封装

3. 跨页面数据传递,编辑页数据提交后数据局步刷新到列表数据

项目源码

FrmStuddentList

public partial class FrmStudentList : Form
{
private Action reload = null;
public FrmStudentList()
{
InitializeComponent();
}
private static FrmStudentList frmStudentList = null;
public static FrmStudentList CreateInstance()
{
if(frmStudentList is null || frmStudentList.IsDisposed)
{
frmStudentList = new FrmStudentList();
}
return frmStudentList;
}
private void FrmStudentList_Load(object sender, EventArgs e)
{
LoadClasse();//加载班级列表
LoadAllStudentList();//加载所有学生信息
} private void LoadAllStudentList()
{
string sql = "select StuId,StuName,c.ClassName,GradeName,Sex,Phone from StudentInfo s " +
"inner join ClassInfo c on c.ClassId=s.ClassId " +
"inner join GradeInfo g on g.GradeId=c.GradeId";
//加载数据
DataTable dtStudents = SqlHelper.GetDataTable(sql);
//组装
if (dtStudents.Rows.Count > 0)
{
foreach (DataRow dr in dtStudents.Rows)
{
string className = dr["ClassName"].ToString();
string gradeName = dr["GradeName"].ToString();
dr["ClassName"] = className + "--" + gradeName;
}
}
//我只想显示固定的列
dgvStudentList .AutoGenerateColumns = false;
// dtStudents.Columns.Remove(dtStudents.Columns[3]);
//绑定数据
dgvStudentList.DataSource = dtStudents;
} private void LoadClasse()
{
//获取数据 ---- 查询 ---写sql
string sql = "select ClassId,ClassName,GradeName from ClassInfo c,GradeInfo g where c.GradeId=g.GradeId"; DataTable dtClasse = SqlHelper.GetDataTable(sql);
//组合班级列表显示项的过程
if (dtClasse.Rows.Count > 0)
{
foreach (DataRow dr in dtClasse.Rows)
{
string className = dr["ClassName"].ToString();
string gradeName = dr["GradeName"].ToString();
dr["ClassName"] = className + "--" + gradeName;
} }
//添加默认选择项
DataRow drNew = dtClasse.NewRow();
drNew["ClassId"] = 0;
drNew["ClassName"] = "请选择"; dtClasse.Rows.InsertAt(drNew, 0); //指定数据源
cmbClassName.DataSource = dtClasse;
cmbClassName.DisplayMember = "ClassName";
cmbClassName.ValueMember = "ClassId";
} private void textBox1_TextChanged(object sender, EventArgs e)
{ } private void btnSearch_Click(object sender, EventArgs e)
{
//接收条件设置信息
int classId = (int)cmbClassName .SelectedValue;
string stuName = txtStuName.Text.Trim(); //查询sql
string sql = "select StuId,StuName,c.ClassName,GradeName,Sex,Phone from StudentInfo s " +
"inner join ClassInfo c on c.ClassId=s.ClassId " +
"inner join GradeInfo g on g.GradeId=c.GradeId";
sql += " where 1=1 ";
if (classId > 0)
{
sql += " and s.ClassId=@ClassId";
}
if (!string.IsNullOrEmpty(stuName))
{
sql += " and StuName like @StuName";
}
sql += " order by StuId"; SqlParameter[] paras =
{
new SqlParameter("@ClassId",classId),
new SqlParameter("@StuName","%"+stuName+"%")
};
//加载数据
DataTable dtStudents = SqlHelper.GetDataTable(sql, paras);
//组装
if (dtStudents.Rows.Count > 0)
{
foreach (DataRow dr in dtStudents.Rows)
{
string className = dr["ClassName"].ToString();
string gradeName = dr["GradeName"].ToString();
dr["ClassName"] = className + "--" + gradeName;
}
}
//我只想显示固定的列
dgvStudentList.AutoGenerateColumns = false; //绑定数据
dgvStudentList .DataSource = dtStudents;
} private void dgvStudentList_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex !=-1)
{
DataGridViewCell cell= dgvStudentList.Rows[e.RowIndex].Cells[e.ColumnIndex];
if (cell is DataGridViewLinkCell && cell.FormattedValue .ToString ()=="修改")
{
reload = LoadAllStudentList ; DataRow dr = (dgvStudentList.Rows[e.RowIndex].DataBoundItem as DataRowView).Row;
int stuId = int.Parse(dr["StuId"].ToString());
FrmEditStudent frmEdit = new FrmEditStudent();
//传值
frmEdit.Tag = new TagObject() { EditId = stuId, Reload = reload };
frmEdit.MdiParent = this.MdiParent;
frmEdit.Show(); }
else if (cell is DataGridViewLinkCell && cell.FormattedValue.ToString() == "删除")
{
if(MessageBox .Show ("您确定要删除该学生信息吗?","删除学生提示",MessageBoxButtons.YesNo,MessageBoxIcon.Question) == DialogResult.Yes)
{
DataRow dr = (dgvStudentList.Rows[e.RowIndex].DataBoundItem as DataRowView).Row;
int stuId = int.Parse(dr["StuId"].ToString());
string sqlDel = "delete StudentInfo where StuId=@StuId";
SqlParameter para = new SqlParameter("@StuId", stuId);
int count = SqlHelper.ExecuteNonQuery(sqlDel, para);
if (count > 0)
{
MessageBox.Show("该学生信息删除成功!", "删除学习提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
DataTable dtStudent = (DataTable)dgvStudentList.DataSource;
dtStudent.Rows.Remove(dr);
dgvStudentList.DataSource = dtStudent;
}
else
{
MessageBox.Show("该学生信息删除失败!", "删除学习提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
}
} private void btnDel_Click(object sender, EventArgs e)
{
List<int> listIds = new List<int>();
int count = 0;
for (int i = 0; i < dgvStudentList .Rows .Count ; i++)
{ DataGridViewCheckBoxCell cell = dgvStudentList.Rows[i].Cells["colCheck"] as DataGridViewCheckBoxCell;
bool chk = Convert.ToBoolean(cell.Value);
if (chk)
{
DataRow dr = (dgvStudentList.Rows[i].DataBoundItem as DataRowView).Row;
int stuId = int.Parse(dr["StuId"].ToString());
listIds.Add(stuId);
} }
if(listIds .Count == 0)
{
MessageBox.Show("请选择要删除的数据!", "删除学生提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
if(listIds .Count > 0)
{
if (MessageBox.Show("您确定要删除该学生信息吗?", "删除学生提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{ using (SqlConnection conn=new SqlConnection(SqlHelper.connString))
{ conn.Open();
SqlTransaction trans = conn.BeginTransaction();
SqlCommand cmd = conn.CreateCommand();
cmd.Transaction = trans;
try
{ foreach (int id in listIds)
{
cmd.CommandText = "delete from StudentInfo where StuId=@StuId";
SqlParameter para = new SqlParameter("@StuId", id);
cmd.Parameters.Clear();
cmd.Parameters.Add(para);
count += cmd.ExecuteNonQuery();
}
trans.Commit();
}
catch (Exception)
{
trans.Rollback();
MessageBox.Show("删除学生出现了异常!", "删除学生提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
} }
if(count==listIds.Count)
{
MessageBox.Show("这些学生信息删除成功!", "删除学生提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
//手动刷新
DataTable dtStudents = (DataTable)dgvStudentList.DataSource;
string idStr = string.Join(",", listIds);
DataRow[] rows= dtStudents.Select("StuId in (" + idStr + ")");
foreach (DataRow dr in rows)
{
dtStudents.Rows.Remove(dr);
}
dgvStudentList.DataSource = dtStudents;
}
}
} }

FrmAddStudent

 public partial class FrmAddStudent : Form
{
public FrmAddStudent()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
//1)获取页面信息输入
string stuName = txtStuName.Text.Trim();
int classId = (int)cmbClassName .SelectedValue;
string sex = rdoMan .Checked ? rdoMan .Text.Trim() : rdoWoman.Text.Trim();
string phone = txtPhone.Text.Trim();
//2)判空处理 姓名不可以为空 电话不可以为空
if (string.IsNullOrEmpty(stuName))
{
MessageBox.Show("姓名不能为空!", "添加学生提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (string.IsNullOrEmpty(phone))
{
MessageBox.Show("电话不能为空!", "添加学生提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
//3)判断 姓名+电话 是否在数据库里已存在 姓名+电话
string sql = "select count(1) from StudentInfo where StuName=@StuName and Phone=@phone";
SqlParameter[] paras =
{
new SqlParameter("@StuName",stuName),
new SqlParameter("@phone",phone)
};
object o = SqlHelper.ExecuteScalar(sql, paras);
if (o != null && o != DBNull.Value && ((int)o) > 0)
{
MessageBox.Show("该学生已存在!", "添加学生提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
//4)添加入库 sql 参数 执行 完成返回受影响行数
string sqlAdd = "insert into StudentInfo(StuName,ClassId,Sex,Phone) values(@StuName,@ClassId,@Sex,@Phone)";
SqlParameter[] parasAdd =
{
new SqlParameter("@StuName",stuName),
new SqlParameter("@ClassId",classId),
new SqlParameter("@Sex",sex),
new SqlParameter("@phone",phone)
};
int count = SqlHelper.ExecuteNonQuery(sqlAdd, parasAdd);
if (count > 0)
{
MessageBox.Show($"学生:{stuName} 添加成功!", "添加学生提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("该学生添加失败,请检查!", "添加学生提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
} private void FrmAddStudent_Load(object sender, EventArgs e)
{
InitClasse();//加载班级列表
rdoMan .Checked = true;
}
private void InitClasse()
{
//获取数据 ---- 查询 ---写sql
string sql = "select ClassId,ClassName,GradeName from ClassInfo c,GradeInfo g where c.GradeId=g.GradeId"; DataTable dtClasses = SqlHelper.GetDataTable(sql);
//组合班级列表显示项的过程
if (dtClasses.Rows.Count > 0)
{
foreach (DataRow dr in dtClasses.Rows)
{
string className = dr["ClassName"].ToString();
string gradeName = dr["GradeName"].ToString();
dr["ClassName"] = className + "--" + gradeName;
} } //指定数据源
cmbClassName .DataSource = dtClasses;
cmbClassName.DisplayMember = "ClassName";
cmbClassName.ValueMember = "ClassId";
cmbClassName.SelectedIndex = 0;
} private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
}
FrmEditStudent
  public partial class FrmEditStudent : Form
{
public FrmEditStudent()
{
InitializeComponent();
}
private Action reload = null;
private int stuId;
private void FrmEditStudent_Load(object sender, EventArgs e)
{
IntiClass();//加载班级列表
InitStuInfo();//加载学生信息
} private void IntiClass()
{
//获取数据 ---- 查询 ---写sql
string sql = "select ClassId,ClassName,GradeName from ClassInfo c,GradeInfo g where c.GradeId=g.GradeId"; DataTable dtClasses = SqlHelper.GetDataTable(sql);
//组合班级列表显示项的过程
if (dtClasses.Rows.Count > 0)
{
foreach (DataRow dr in dtClasses.Rows)
{
string className = dr["ClassName"].ToString();
string gradeName = dr["GradeName"].ToString();
dr["ClassName"] = className + "--" + gradeName;
} } //指定数据源
cmbClassName.DataSource = dtClasses;
cmbClassName.DisplayMember = "ClassName";
cmbClassName.ValueMember = "ClassId";
cmbClassName.SelectedIndex = 0;
} private void InitStuInfo()
{
//获取stuid
if(this.Tag!=null)
{
TagObject tagObject = (TagObject)this.Tag;
this.stuId = tagObject.EditId;
this.reload = tagObject.Reload;
}
//查询出来
string sql = @"select StuName,Sex,ClassId,Phone from StudentInfo where StuId=@StuId";
SqlParameter paraId = new SqlParameter("@StuId", stuId);
SqlDataReader dr = SqlHelper.ExecuteReader(sql, paraId);
if (dr.Read())
{
txtStuName.Text = dr["StuName"].ToString();
txtPhone.Text = dr["Phone"].ToString();
string sex = dr["Sex"].ToString();
if (sex == "男")
{
rdoMan.Checked = true;
}
else
{
rdoWoman.Checked = true;
}
int classId = (int)dr["ClassId"];
cmbClassName.SelectedValue = classId;
}
dr.Close();
} private void btnEdit_Click(object sender, EventArgs e)
{
//1)获取页面信息输入
string stuName = txtStuName.Text.Trim();
int classId = (int)cmbClassName.SelectedValue;
string sex = rdoMan.Checked ? rdoMan.Text.Trim() : rdoWoman.Text.Trim();
string phone = txtPhone.Text.Trim();
//2)判空处理 姓名不可以为空 电话不可以为空
if (string.IsNullOrEmpty(stuName))
{
MessageBox.Show("姓名不能为空!", "修改学生提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (string.IsNullOrEmpty(phone))
{
MessageBox.Show("电话不能为空!", "修改学生提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
//3)判断 姓名+电话 是否在数据库里已存在 姓名+电话
string sql = "select count(1) from StudentInfo where StuName=@StuName and Phone=@phone and StuId<>@StuId";
SqlParameter[] paras =
{
new SqlParameter("@StuName",stuName),
new SqlParameter("@phone",phone),
new SqlParameter ("@StuId",stuId)
};
object o = SqlHelper.ExecuteScalar(sql, paras);
if (o != null && o != DBNull.Value && ((int)o) > 0)
{
MessageBox.Show("该学生已存在,请重新修改!", "修改学生提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
//4)修改入库 sql 参数 执行 完成返回受影响行数
string sqlEdit = " update StudentInfo " +
" set stuName=@StuName, ClassId=@ClassId,Sex=@Sex,Phone=@Phone " +
" where StuId=@StuId ";
SqlParameter[] parasAdd =
{
new SqlParameter("@StuName",stuName),
new SqlParameter("@ClassId",classId),
new SqlParameter("@Sex",sex),
new SqlParameter("@phone",phone),
new SqlParameter ("@StuId",stuId)
};
int count = SqlHelper.ExecuteNonQuery(sqlEdit, parasAdd);
if (count > 0)
{
MessageBox.Show($"学生:{stuName} 修改成功!", "添加学生提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.reload.Invoke();
}
else
{
MessageBox.Show("该学生修改失败,请检查!", "添加学生提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
} private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
}

有兴趣研究的。可以进下面QQ群,在群在线文档里面进行下载。

简单的winform学生管理系统Demo的更多相关文章

  1. C++ 实现简单命令行学生管理系统

    C++ 实现简单命令行学生管理系统 预览: 编译环境是macOS.system("clear") 在windows下请换成 system("cls") #inc ...

  2. Winform 学生管理系统增删改查

    数据库: create database adonet go use adonet go create table xue ( code ), name ), sex bit, birth datet ...

  3. 【IOS开发笔记02】学生管理系统

    端到端的机会 虽然现在身处大公司,但是因为是内部创业团队,产品.native.前端.服务器端全部坐在一起开发,大家很容易做零距离交流,也因为最近内部有一个前端要转岗过来,于是手里的前端任务好像可以抛一 ...

  4. 【IOS开发笔记01】学生管理系统(上)

    端到端的机会 虽然现在身处大公司,但是因为是内部创业团队,产品.native.前端.服务器端全部坐在一起开发,大家很容易做零距离交流,也因为最近内部有一个前端要转岗过来,于是手里的前端任务好像可以抛一 ...

  5. Java案例——学生管理系统

    简单完整的学生管理系统 学生类 public class Student { private String id; private String age; private String name; p ...

  6. Java写一个简单学生管理系统

    其实作为一名Java的程序猿,无论你是初学也好,大神也罢,学生管理系统一直都是一个非常好的例子,初学者主要是用数组.List等等来写出一个简易的学生管理系统,二.牛逼一点的大神则用数据库+swing来 ...

  7. php实现简单的学生管理系统

    php实现学生管理系统 一.效果 二.代码框架 functions文件夹里面是封装的mysqli的数据库操作函数和一个跳转的函数 student文件夹里面就是学生管理系统的主界面 applicatio ...

  8. <每日一题>题目7:简单的学生管理系统V1.0

    ''' # 学生管理系统v1.0 # 添加学生的信息 # 删除学生的信息 # 修改学生的信息 # 查看学生的信息 #遍历学生的信息 #退出系统 ''' import json #1 显示操作功能 de ...

  9. Java实现功能简单的学生管理系统(附带源代码)

    这几天Java学了点新的知识,打算要用这些知识做一个比较简单的管理系统,实战一下子,代码中的功能简洁,可能不多,但是作为一个练手来了解一个项目是怎么样一点一点思考的还是不错的 一.代码中要实现的功能 ...

  10. jdbc简单学生管理系统

    这个是java连接mysql数据库的一个简单学生系统,通过jdbc连接数据库. 工具类 JDBCuntils. package Student; import java.io.IOException; ...

随机推荐

  1. ubuntu 22.04.1安装雷池开源waf应用防火墙

    ubuntu 22.04.1安装雷池开源waf应用防火墙 雷池waf是开源应用防火墙,国内首创.业内领先的智能语义分析算法 官方网站:https://waf-ce.chaitin.cn/ 官方文档:h ...

  2. 10、goto语句

    1.goto语句的概念 goto语句:可以无条件的转移到运行中指定的行 这个用的比较少,了解一下即可 2.语法结构和用法 /** * @author ly (个人博客:https://www.cnbl ...

  3. 记录一下工作中SQL Server数据库遇到的问题

    解决查询同步人员信息,使用 case when then解决多IF判断问题 select LOCATION, cert_type, WEIXIN, MARRIAGE, RECORD_WAGE, SPE ...

  4. 理解 Paimon changelog producer

    介绍 目的 Chaneglog producer 的主要目的是为了在 Paimon 表上产生流读的 changelog, 所以如果只是批读的表是可以不用设置 Chaneglog producer 的. ...

  5. RV1126 分区教程

    一.前言 期初我是想弄一个分区存放自己的 APP 程序,如果需要更改应用的时候,只需要烧写独立的分区即可,就不需要重新烧写 rootfs.这是一个简单的操作,为啥还需要记录了,因为我在里面遇到了一些坑 ...

  6. 一款基于.NET Core的快速开发框架、支持多种前端UI、内置代码生成器

    前言 经常看到有小伙伴在技术群里问有没有什么好用且快速的开发框架推荐的,今天就给大家分享一款基于MIT License协议开源.免费的.NET Core快速开发框架.支持多种前端UI.内置代码生成器. ...

  7. Semantic Kernel 正式发布 v1.0.1 版本

    微软在2023年12月19日在博客上(Say hello to Semantic Kernel V1.0.1)发布了Semantic kernel的.NET 正式1.0.1版本.新版本提供了新的文档, ...

  8. jclasslib的安装

    双击安装包打开后点击下一步,然后选择安装的路径. 默认路径,如果c盘有空间不建议更改路径,然后再次点击下一步 依然选择下一步 最后点击完成即可完成安装.现在可以使用啦 注:如果需要安装包,请点击下面链 ...

  9. 从零玩转前后端加解密之SM2-sm2

    title: 从零玩转前后端加解密之SM2 date: 2022-08-21 19:42:00.907 updated: 2023-03-30 13:28:48.866 url: https://ww ...

  10. Odoo16—国际化翻译

    开发odoo系统模块的时候,如果一开始就有国际化的需求,无论是模型的定义还是视图的构建,建议使用英语作为第一语言:一方面,英语本身就是一种国际化的语言:另一方面,odoo内置模型字段描述如Create ...