简单的winform学生管理系统Demo
界面效果



练习重点
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的更多相关文章
- C++ 实现简单命令行学生管理系统
C++ 实现简单命令行学生管理系统 预览: 编译环境是macOS.system("clear") 在windows下请换成 system("cls") #inc ...
- Winform 学生管理系统增删改查
数据库: create database adonet go use adonet go create table xue ( code ), name ), sex bit, birth datet ...
- 【IOS开发笔记02】学生管理系统
端到端的机会 虽然现在身处大公司,但是因为是内部创业团队,产品.native.前端.服务器端全部坐在一起开发,大家很容易做零距离交流,也因为最近内部有一个前端要转岗过来,于是手里的前端任务好像可以抛一 ...
- 【IOS开发笔记01】学生管理系统(上)
端到端的机会 虽然现在身处大公司,但是因为是内部创业团队,产品.native.前端.服务器端全部坐在一起开发,大家很容易做零距离交流,也因为最近内部有一个前端要转岗过来,于是手里的前端任务好像可以抛一 ...
- Java案例——学生管理系统
简单完整的学生管理系统 学生类 public class Student { private String id; private String age; private String name; p ...
- Java写一个简单学生管理系统
其实作为一名Java的程序猿,无论你是初学也好,大神也罢,学生管理系统一直都是一个非常好的例子,初学者主要是用数组.List等等来写出一个简易的学生管理系统,二.牛逼一点的大神则用数据库+swing来 ...
- php实现简单的学生管理系统
php实现学生管理系统 一.效果 二.代码框架 functions文件夹里面是封装的mysqli的数据库操作函数和一个跳转的函数 student文件夹里面就是学生管理系统的主界面 applicatio ...
- <每日一题>题目7:简单的学生管理系统V1.0
''' # 学生管理系统v1.0 # 添加学生的信息 # 删除学生的信息 # 修改学生的信息 # 查看学生的信息 #遍历学生的信息 #退出系统 ''' import json #1 显示操作功能 de ...
- Java实现功能简单的学生管理系统(附带源代码)
这几天Java学了点新的知识,打算要用这些知识做一个比较简单的管理系统,实战一下子,代码中的功能简洁,可能不多,但是作为一个练手来了解一个项目是怎么样一点一点思考的还是不错的 一.代码中要实现的功能 ...
- jdbc简单学生管理系统
这个是java连接mysql数据库的一个简单学生系统,通过jdbc连接数据库. 工具类 JDBCuntils. package Student; import java.io.IOException; ...
随机推荐
- .Net 8与硬件设备能碰撞出怎么样的火花(使用ImageSharp和Protobuf协议通过HidApi与设备通讯)
前言 本人最近在社区里说想做稚晖君的那个瀚文键盘来着,结果遇到两个老哥一个老哥送了我电路板,一个送了我焊接好元件的电路板,既然大家这么舍得,那我也就真的投入制作了这把客制化键盘,当然我为了省钱也是特意 ...
- JXNU acm选拔赛 涛神的城堡
涛神的城堡 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submiss ...
- jenkins pipeline语法、自动生成、部署案例
Jenkins Pipeline是一套插件,支持在Jenkins中实现持续集成和持续交付: pipeline的编写都要写入到一个名为Jenkinsfile的文件中. 流水线脚本管理 Jenkinsfi ...
- IPTV SQM的项目总结
本文于2015年底完成,发布在个人博客网站上,标题为<项目总结--纪念我参与过的IPTV SQM项目>. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 时 ...
- 【docker】docker中装Redis集群
一.搭建步骤 1.启动容器 #关闭防火墙 systemctl start docker 2.新建6个docker容器redis实例 docker run -d --name redis-node-1 ...
- Dart 3.2 更新盘点
作者 / Kevin Moore 和 Michael Thomsen 我们隆重宣布推出 Dart 3.2,这一版本针对以下方面做出了改进: 新增了一项语言功能,可对私有 final 字段进行非空升级: ...
- Salesforce LWC学习(四十六) record-picker组件浅谈
本篇参考: https://developer.salesforce.com/docs/platform/lwc/guide/reference-graphql.html https://develo ...
- vue3 + vite + ts 配置 @ 别名
第一步 npm install @types/node -D 第二步 这是原 vite.config.ts文件 import { defineConfig } from 'vite' import v ...
- 云图说 | 快速创建一个kubernetes集群
摘要:3分钟快速创建您的第一个kubernetes虚拟机集群. 随着应用程序开发向基于容器的方向发展,编排和管理资源的需求变得越来越重要.Kubernetes是一个开源的.功能强大的容器编排系统,用于 ...
- MemArts :高效解决存算分离架构中数据访问的组件
摘要:计算侧需要一个高速的缓存层来消除计算集群和OBS之间的数据访问鸿沟.为了解决这个问题,提出MemArts CC分布式客户端缓存. 本文分享自华为云社区<华为云全新缓存生态组件MemArts ...