一、案例功能的实现

数据:

--专业
create table ProfessionInfo
(
ProfessionID int primary key identity(1,1), --专业编号
professionName varchar(50) not null unique --专业名称
)
--学生
create table StudentInfo
(
StuID varchar(20) primary key, --学生学号
StuName varchar(50) not null, --学生姓名
StuAge int not null check(StuAge > 0 and StuAge < 130), --学生年龄
StuSex char(2) not null check(StuSex in('男','女')), --学生性别
StuHobby nvarchar(100), --爱好
ProfessionID int not null references ProfessionInfo(ProfessionID), --所属专业编号
)
--添加专业信息
insert into ProfessionInfo(professionName) values('电子竞技')
insert into ProfessionInfo(professionName) values('软件开发')
insert into ProfessionInfo(professionName) values('医疗护理')
--插入学生信息
insert into StudentInfo(StuID,StuName,StuAge,StuSex,StuHobby,ProfessionID)
values('001','刘备',18,'男','',1)
insert into StudentInfo(StuID,StuName,StuAge,StuSex,StuHobby,ProfessionID)
values('002','关羽',20,'男','',2)
insert into StudentInfo(StuID,StuName,StuAge,StuSex,StuHobby,ProfessionID)
values('003','张飞',19,'男','',2)
insert into StudentInfo(StuID,StuName,StuAge,StuSex,StuHobby,ProfessionID)
values('004','孙尚香',17,'女','',3)

业务需求:

(1)专业下拉框绑定专业表数据,网格控件绑定学生数据,并且点击"搜索"按钮可以多条件组合查询。

(2)选中某一行,右键可以弹出"删除"菜单,点击"删除"菜单可以删除学生数据。

(3)点击"新增"按钮,弹出新增窗体,在此窗体中完成学生的新增操作。

(4)选中某一行,点击"编辑"按钮,弹出编辑窗体,在此窗体中完成数据的修改。

备注:其中性别的单选框,以及爱好的多选框分别用两个Pannel容器包含。

实现代码:

(1)查询窗体绑定专业信息、绑定学生信息以及搜索功能代码:

#region 绑定专业信息到下拉框
private void BindProfession()
{
DataTable dt = new DataTable();
DBHelper.PrepareSql("select * from ProfessionInfo");
dt = DBHelper.ExecQuery();
DataRow dr = dt.NewRow();
dr["ProfessionID"] = 0;
dr["professionName"] = "--请选择--";
dt.Rows.InsertAt(dr, 0);
this.cmbPro.DataSource = dt;
this.cmbPro.DisplayMember = "professionName";
this.cmbPro.ValueMember = "ProfessionID";
}
#endregion #region 绑定学生数据
private void BindData()
{
string sql = "select * from StudentInfo inner join ProfessionInfo on StudentInfo.ProfessionID=ProfessionInfo.ProfessionID where 1 = 1 ";
if(!this.cmbPro.SelectedValue.ToString().Equals("0"))
sql += " and StudentInfo.ProfessionID = " + this.cmbPro.SelectedValue.ToString();
if(!this.txtName.Text.Equals(""))
sql += " and StuName like '%" + this.txtName.Text + "%'";
this.dataGridView1.AutoGenerateColumns = false;
DBHelper.PrepareSql(sql);
this.dataGridView1.DataSource = DBHelper.ExecQuery();
}
#endregion private void Form1_Load(object sender, EventArgs e)
{
BindProfession();
BindData();
} private void btSearch_Click(object sender, EventArgs e)
{
BindData();
}

(2)删除菜单代码:

private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)
{
//添加是否确定删除的对话框
DialogResult result = MessageBox.Show("确定要删除数据吗,删除之后无法恢复!", "提示框",
MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
if (result == DialogResult.Cancel)
return;
string stuid = this.dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
string sql = "delete from StudentInfo where StuID = @StuID";
DBHelper.PrepareSql(sql);
DBHelper.SetParameter("StuID", stuid);
int rowCount = DBHelper.ExecNonQuery();
if (rowCount == 1)
MessageBox.Show("删除成功!");
else
MessageBox.Show("删除失败!");
BindData();
}

(3)添加学生信息窗体代码:

#region 绑定专业信息到下拉框
private void BindProfession()
{
DataTable dt = new DataTable();
DBHelper.PrepareSql("select * from ProfessionInfo");
dt = DBHelper.ExecQuery();
DataRow dr = dt.NewRow();
dr["ProfessionID"] = 0;
dr["professionName"] = "--请选择--";
dt.Rows.InsertAt(dr, 0);
this.cmbPro.DataSource = dt;
this.cmbPro.DisplayMember = "professionName";
this.cmbPro.ValueMember = "ProfessionID";
}
#endregion
private void FrmAdd_Load(object sender, EventArgs e)
{
BindProfession();
} private void btAdd_Click(object sender, EventArgs e)
{
string sql = "insert into StudentInfo(StuID,StuName,StuAge,StuSex,StuHobby,ProfessionID) values(@StuID,@StuName,@StuAge,@StuSex,@StuHobby,@ProfessionID)";
DBHelper.PrepareSql(sql);
DBHelper.SetParameter("StuID", this.txtId.Text);
DBHelper.SetParameter("StuName",this.txtName.Text);
DBHelper.SetParameter("StuAge",this.txtAge.Text);
//性别处理
string sex = "";
if (this.rbBoy.Checked == true) sex = this.rbBoy.Text;
if (this.rbGirl.Checked == true) sex = this.rbGirl.Text;
DBHelper.SetParameter("StuSex", sex);
//爱好处理
string hobby = "";
foreach (CheckBox ck in this.panel2.Controls)
{
if (ck.Checked == true)
{
if (!hobby.Equals(""))
hobby += ",";
hobby += ck.Text;
}
}
DBHelper.SetParameter("StuHobby", hobby);
DBHelper.SetParameter("ProfessionID",this.cmbPro.SelectedValue.ToString());
int rowCount = DBHelper.ExecNonQuery();
if (rowCount == 1)
{
MessageBox.Show("新增成功!");
this.Close();
}
else
{
MessageBox.Show("新增失败!");
}
}

(4)编辑学生信息窗体代码:

public string StuID { get; set; } //学生编号
#region 绑定专业信息到下拉框
private void BindProfession()
{
DataTable dt = new DataTable();
DBHelper.PrepareSql("select * from ProfessionInfo");
dt = DBHelper.ExecQuery();
DataRow dr = dt.NewRow();
dr["ProfessionID"] = 0;
dr["professionName"] = "--请选择--";
dt.Rows.InsertAt(dr, 0);
this.cmbPro.DataSource = dt;
this.cmbPro.DisplayMember = "professionName";
this.cmbPro.ValueMember = "ProfessionID";
}
#endregion
private void BindDetail()
{
string sql = "select * from StudentInfo where StuID = " + this.StuID;
DBHelper.PrepareSql(sql);
DataTable dt = new DataTable();
dt = DBHelper.ExecQuery();
this.txtId.Text = dt.Rows[0]["StuID"].ToString();
this.txtName.Text = dt.Rows[0]["StuName"].ToString();
this.txtAge.Text = dt.Rows[0]["StuAge"].ToString();
this.cmbPro.SelectedValue = dt.Rows[0]["ProfessionID"].ToString();
//性别处理
if (dt.Rows[0]["StuSex"].ToString().Equals("男"))
this.rbBoy.Checked = true;
else
this.rbGirl.Checked = true;
//爱好处理
string[] arrHobby = dt.Rows[0]["StuHobby"].ToString().Split(',');
foreach (string hobby in arrHobby)
{
foreach (CheckBox ck in this.panel2.Controls)
{
if (ck.Text.Equals(hobby))
ck.Checked = true;
}
} }
private void FrmEdit_Load(object sender, EventArgs e)
{
BindProfession();
BindDetail();
} private void btUpdate_Click(object sender, EventArgs e)
{
string sql = "update StudentInfo set StuName=@StuName,StuAge=@StuAge,StuSex=@StuSex,StuHobby=@StuHobby,ProfessionID=@ProfessionID where StuID=@StuID";
DBHelper.PrepareSql(sql);
DBHelper.SetParameter("StuName", this.txtName.Text);
DBHelper.SetParameter("StuAge", this.txtAge.Text);
//性别处理
string sex = "";
if (this.rbBoy.Checked == true) sex = this.rbBoy.Text;
if (this.rbGirl.Checked == true) sex = this.rbGirl.Text;
DBHelper.SetParameter("StuSex", sex);
//爱好处理
string hobby = "";
foreach (CheckBox ck in this.panel2.Controls)
{
if (ck.Checked == true)
{
if (!hobby.Equals(""))
hobby += ",";
hobby += ck.Text;
}
}
DBHelper.SetParameter("StuHobby", hobby);
DBHelper.SetParameter("ProfessionID", this.cmbPro.SelectedValue.ToString());
DBHelper.SetParameter("StuID", this.StuID);
int rowCount = DBHelper.ExecNonQuery();
if (rowCount == 1)
{
MessageBox.Show("修改成功!");
this.Close();
}
else
{
MessageBox.Show("修改失败!");
}
}

(5)查询窗体中"新增"和"编辑"按钮代码:

private void btAdd_Click(object sender, EventArgs e)
{
FrmAdd frm = new FrmAdd();
//frm.Owner = this;
frm.Show();
}
private void btEdit_Click(object sender, EventArgs e)
{
string stuid = this.dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
FrmEdit frm = new FrmEdit();
frm.StuID = stuid;
frm.Show();
}

二、补充:连接字符串配置

将数据库连接字符串直接写在C#代码中,如果连接字符串需要发生改变,必须在C#代码中修改,并且重新进行编译的操作,给软件实施带来了麻烦。

解决此问题,可以将数据库连接字符串存放在配置文件中。

(1)在项目中找到App.config文件,如果没有此文件可以添加一个应用程序配置文件,在此配置文件的configuration节点内部添加如下配置:

<connectionStrings>
<add name="DefaultConn" connectionString="server=.;database=DBTEST;uid=sa;pwd=123456;"/>
</connectionStrings>

(2)给项目添加引用"System.Configuration",并且将C#中连接字符串的赋值修改如下:

public static string connStr = ConfigurationManager.ConnectionStrings["DefaultConn"].ConnectionString;

借助DBHelper实现学生管理案例分析的更多相关文章

  1. 098 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 02 编写并测试Subject类

    098 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 02 编写并测试Subject类 本文知识点:编写并测试Subject类 说明: ...

  2. 099 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类

    099 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类 本文知识点:编写并测试Subject类 说明: ...

  3. 101 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 05 通过方法实现学生类与专业类关联——方案二

    101 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 05 通过方法实现学生类与专业类关联--方案二 本文知识点:通过方法实现学生类与 ...

  4. 2020BUAA软工个人博客作业-软件案例分析

    2020BUAA软工个人博客作业-软件案例分析 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件案例分 ...

  5. Vue基础语法-数据绑定、事件处理和扩展组件等知识详解(案例分析,简单易懂,附源码)

    前言: 本篇文章主要讲解了Vue实例对象的创建.常用内置指令的使用.自定义组件的创建.生命周期(钩子函数)等.以及个人的心得体会,汇集成本篇文章,作为自己对Vue基础知识入门级的总结与笔记. 其中介绍 ...

  6. 个人作业-Week2 案例分析

    微软必应词典客户端的案例分析 第一部分 调研,评测 1)bug: 运行平台:iOS 10.0.2 必应词典版本:4.2.2 1. bug标题:词库加载错误 bug详细描述:学习界面中的经典词库出国考试 ...

  7. [2017BUAA软工助教]案例分析小结

    BUAA案例分析小结 一.作业要求 http://www.cnblogs.com/jiel/p/7631784.html 二.统计数据 总人数 神策数据 博客园博客 必应词典 30 1 12 17 三 ...

  8. 第四次作业——关于石墨文档(Android)客户端的案例分析

    关于石墨文档(Android)客户端的案例分析 作业地址:[https://edu.cnblogs.com/campus/nenu/2016CS/homework/2505] 第一部分调研,评测 1. ...

  9. 个人作业2——集大通APP案例分析

    个人作业2——集大通APP案例分析 产品:集大通 我认为这个是我们学校的APP,我们应该支持一下. 一.个人体验 1.下载并使用,描述最简单直观的个人第一次上手体验. ①界面美观,可以感受到丰富的校园 ...

随机推荐

  1. ABC231H(二分图最小权边覆盖)

    首先将行列分别抽象成 \(h, w\) 个点,每个格子视作连接两个点的一条边,那么问题就转化为了二分图最小权边覆盖问题. 考虑最后答案形如:若干组互不相交的匹配加上其他点连接到匹配内. 于此同时,不在 ...

  2. svn使用规范、在Windows下使用svn命令行工具、svn命令行的解释

    以前在公司一直使用git,现在公司有用svn,一时间还真的不知道如何下手,在网上搜寻了很多大神和官网文档的指导,总结了下面一份教程,希望能够帮助大家快速上手,如果想更细致的了解相关内容,可以点击每个小 ...

  3. LAMP以及各组件的编译安装

    LAMP以及各组件的编译安装 目录 LAMP以及各组件的编译安装 一.LAMP 1. LAMP概述 2. 各组件的主要作用 3. 平台环境的安装顺序 二.编译安装apache httpd 1. 关闭防 ...

  4. .NET6: 开发基于WPF的摩登三维工业软件 (2)

    在<.NET6: 开发基于WPF的摩登三维工业软件 (1)>我们创建了一个"毛坯"界面,距离摩登还差一段距离.本文将对上一阶段的成果进行深化,实现当下流行的暗黑风格UI ...

  5. windows内核基础与异常处理

    前两日碰到了用异常处理来做加密的re题目 所以系统学习一下windows内核相关 windows内核基础 权限级别 内核层:R0 零环 核心态工作区域 大多数驱动程序 应用层:R3 用户态工作区域 只 ...

  6. Solution -「AT 3913」XOR Tree

    \(\mathcal{Description}\)   Link.   给定一棵树,边 \((u,v)\) 有边权 \(w(u,v)\).每次操作可以使一条简单路径上的边权异或任意非负整数.求最少的操 ...

  7. Solution -「LOCAL」画画图

    \(\mathcal{Description}\)   OurTeam.   给定一棵 \(n\) 个点的树形随机的带边权树,求所有含奇数条边的路径中位数之和.树形生成方式为随机取不连通两点连边直到全 ...

  8. 再也不用担心重装VSCode了

    1. 关于Settings Sync插件 Setings Sync插件可以同步你的VSCode配置到Github Gist,当你更换电脑重新搭建VSCode环境的时候,直接使用该插件拉取你之前同步的配 ...

  9. 《深度探索C++对象模型》第一章 | 关于对象

    C++对象模式 非静态数据成员放置在每个类对象内,静态数据成员则被放置在所有类对象之外.静态和非静态的成员函数也被放置在所有类对象之外.每个类产生一堆指向虚函数的指针,放在虚表(vtbl)中.每个类对 ...

  10. Hyperledger Fabric 2.x 动态更新智能合约

    一.说明 在上一篇文章中分享了智能合约的安装与使用,如果业务有变更代码需要修改怎么办呢?本文分享如何对已安装的合约进行版本更新. 二.环境准备 区块链网络安装:<Hyperledger Fabr ...