WinFrom开发小案例
C#
开发环境:
VisualStudio2015
数据库:
SQLserver2008
程序主界面:

注释:
lbl标签:
程序中的lbl标签:编号、人数、姓名、性别、请输入要查询的信息,这里他们只起到了说明作用,所有命名一般为默认,只修改Text文本。
程序中的lbl标签:编号后面的0,他起到了同步表中选中人员的id(编号) 人数后面的0,他的作用是时时更新表中总人数,他们的命名要规范,后面的代码才能编写更方便。
按钮:
程序中的btn按钮:保存、重置、退出、添加、查询,要想实现他们的功能,就得双击他们然后在里面打上代码,才能赋予他们功能,这里要注意按钮的命名规范。
保存按钮功能:
程序运行时,在姓名TextBox文本框中、性别TextBox文本框中,分别输入人员的姓名、性别,然后按保存按钮,人员的信息就被存到了数据库中。
运行图:

保存按钮代码:
if (checkinput())
{
using (SqlConnection con = new SqlConnection(conStr))
{
con.Open();
string sql = "insert B(name,sex) values (@name,@sex)";
SqlCommand cmd = new SqlCommand(sql, con);
cmd.Parameters.Add(new SqlParameter("@name", txtname.Text));
cmd.Parameters.Add(new SqlParameter("@sex", txtsex.Text));
int fh = cmd.ExecuteNonQuery();
if (fh > ) MessageBox.Show("添加成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
sj();
rs();
}
}
这里调用了检测输入的完整性方法:checkinput,如果姓名TextBox文本框或性别TextBox文本框中,姓名没输入,程序会提示请输入姓名,性别没输入,程序会提示请输入性别。
检测输入的完整性方法代码:
private bool checkinput()
{
if (txtname.Text == null || txtname.Text == "")
{
MessageBox.Show("请输入姓名", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
txtname.Focus();
return false;
}
if (txtsex.Text == null || txtsex.Text == "")
{
MessageBox.Show("请输入性别", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
txtsex.Focus();
return false;
}
return true;
}
信息输入不完整运行效果图:


保存按钮的代码里还调用了,sj();rs();这两个方法,sj();这个方法起到了刷新添加人员的信息到DGV表格中,rs();这个方法起到了更新lbl人数标签后面的数据功能,更新了总人数的数据信息。
新加一个人员运行图:

信息输入完整添加成功,大家看人数后面的数字是:12,当我按确定以后,神奇的事情就发生了!

人数后面的数字12变成了13,这里就是因为保存按钮里调用了,rs();这个方法所以才有更新数据的功能
rs();方法的代码:
private void rs()
{
using (SqlConnection con = new SqlConnection("server=.;uid=sa;pwd=sa;database=YG"))
{
con.Open();
string sql = "select count(*)from B";
SqlCommand cmd = new SqlCommand(sql, con);
object cx = cmd.ExecuteScalar();
//lblRS.Text = cx.ToString(); 将查询到的结果同步标签
lblrs.Text = cx.ToString(); //将查询到的结果同步到lbl标签
}
}
新保存的人员数据,马上就能在DGV表格中找到:

这是因为保存按钮代码里调用了,sj();这个方法,将新保存的人员信息更新到了DGV表格中。
sj();方法的代码:
private void sj()
{
SqlConnection con = new SqlConnection(conStr);//创建连接对象指定连接字符串
string sql = "select*from B";//sql查询语句
SqlDataAdapter cx = new SqlDataAdapter(sql, con);//连接数据库并执行sql语句
DataTable ta = new DataTable();//创建表对象
cx.Fill(ta);//将查询的内容填充到表对象
dataGridView1.DataSource = ta;//设置DGV表的数据来源
}
保存按钮代码:
if (checkinput())//调用检测输入的完整性方法
{
using (SqlConnection con = new SqlConnection(conStr))//创建连接对象,指定连接字符串
{
con.Open();//打开连接
string sql = "insert B(name,sex) values (@name,@sex)";//SQL语句,在数据库里要执行的操作
SqlCommand cmd = new SqlCommand(sql, con);//Cmand命名对象执行操作
cmd.Parameters.Add(new SqlParameter("@name", txtname.Text));//指定参数跟对应的数据匹配
cmd.Parameters.Add(new SqlParameter("@sex", txtsex.Text));//指定参数跟对应的数据匹配
int fh = cmd.ExecuteNonQuery();//ExecuteNonQuery(),这个方法在执行增、删、改的时候就调用它
if (fh > ) MessageBox.Show("添加成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
sj();//调用这个方法更新DGV表格中的数据
rs();//调用这个方法更行lbl总人数的数据
}
}
SqlCommand对象的三个方法:
ExcuteScalar():
这个方法只返回查询结果集的第一行第一列
ExcuteNonQuery():
执行一个SQL语句,返回受影响的行数,这个方法主要用于执行对数据库执行增加、修改、删除操作
ExcuteReader():
查询多行多列
重置按钮的代码:
lblid.Text = "";//lbl文本默认为0
txtname.Clear();//将Text文本框的内容清空
txtsex.Clear();//将Text文本框的内容清空
txtname.Focus();//设置焦点
运行图:

输入好信息后,点击重置按钮就会清空输入的信息

退出按钮的代码:
Application.Exit();
点击退出后,程序就会被关闭。
添加按钮代码:
添加人员 a = new 添加人员();//创建窗体对象
a.ShowDialog();//以对话框模式弹出
sj();//调用sj();这个方法来更新添加的人员数据到DGV表格中
这里添加按钮的功能跟保存按钮的功能是类似的,目的都是为了添加人员数据,只不过我们在这里做了一点代码知识的扩展。
运行图:

输入的信息不完整的话,会提示请输入完整的信息,这里也得写一个检测输入完整性的方法,信息输入完整后就可以点击保存了,保存按钮的代码和上面的类似,点击返回按钮后当前窗体就会关闭返回到人员管理主界面。
将SQL数据库中的数据读取到程序的DGV表格中代码:
private void sj()
{
SqlConnection con = new SqlConnection(conStr);//创建连接对象指定连接字符串
string sql = "select*from B";//sql查询语句
SqlDataAdapter cx = new SqlDataAdapter(sql, con);//连接数据库并执行sql语句
DataTable ta = new DataTable();//创建表对象
cx.Fill(ta);//将查询的内容填充到表对象
dataGridView1.DataSource = ta;//设置DGV表的数据来源
}
其实这个方法在前面就已经出现过了,当我们新增一个人员的时候,就得调用sj();这个方法来更新DGV表格中的数据。
查询按钮代码:
SqlConnection con = new SqlConnection(conStr);//创建连接对象指定连接字符串
//string sql = "select * from B where name like '%"+ txtcx.Text + "%'";
string sql = string.Format("select*from B where name like'%{0}%' or sex like'%{1}%' or id like'%{2}%'",txtcx.Text,txtcx.Text,txtcx.Text);//SQL语句根据TextBox输入的查询条件进行模糊查询
DataTable b1 = new DataTable();//创建表对象
SqlDataAdapter cx1 = new SqlDataAdapter(sql, con);//连接数据库并执行sql语句
cx1.Fill(b1);//将查询的内容填充到表对象
dataGridView1.DataSource = b1;//设置DGV表的数据来源
运行图:

在TextBox文本框中,根据姓查询这里输入了一个:刘 DGV表格中就会显示所有姓刘的人员信息
运行图:

在TextBox文本框中,根据性别查询这里输入了一个:男 DGV表格中显示了所有性别为男的信息。
那么功能都差不多快完善了,我们会发现有了新增,却少了删除跟修改的功能!!!
运行图:

在这里我们可以在DGV表格里加一个上下文菜单,来实现修改和删除的功能。
右键菜单中修改按钮的代码:
添加人员 a = new 添加人员();//创建窗体对象
a.Text = "修改人员";//将添加人员的窗体Text文本修改为“修改人员”
a.Tag = dataGridView1.SelectedRows[].Cells["id"].Value.ToString();//将选中的数据传递给修改人员窗体
a.txtname.Text = dataGridView1.SelectedRows[].Cells["name"].Value.ToString();//DGV表中选中的人员名字传递到修改人员窗体
a.txtsex.Text = dataGridView1.SelectedRows[].Cells["sex"].Value.ToString();///DGV表中选中的人员性别传递到修改人员窗体
a.ShowDialog();//以对话框模式弹出
运行图:

修改人员的窗体与点击添加按钮弹出的窗体是同一个窗体,这里只不过是用代码修改了窗体的Text文本而已,DGV表中选中的数据也同步到了修改人员窗体对应的Text文本框中,在这里我们只需要直接修改那些要修改的地方就KO了。
运行图:

修改人员窗体中保存按钮代码:
if (checkinput())
{
if (this.Text == "添加人员")
{
using (SqlConnection con = new SqlConnection(conStr))
{
con.Open();
string sql = "insert B(name,sex) values (@name,@sex)";
SqlCommand cmd = new SqlCommand(sql, con);
cmd.Parameters.Add(new SqlParameter("@name", txtname.Text));
cmd.Parameters.Add(new SqlParameter("@sex", txtsex.Text));
int fh = cmd.ExecuteNonQuery();
if (fh > ) MessageBox.Show("添加成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
this.Close();
}
}
else
{
using (SqlConnection con = new SqlConnection(conStr))
{
con.Open();
//update<修改对象所在表> set < 修改对象 >=< 值 > where < 条件对象 >=< '条件内容' >
string sql = "update B set name=@name,sex=@sex where id=@id";
SqlCommand cmd = new SqlCommand(sql, con);
cmd.Parameters.Add(new SqlParameter("@id", this.Tag.ToString()));
cmd.Parameters.Add(new SqlParameter("@name", txtname.Text));
cmd.Parameters.Add(new SqlParameter("@sex", txtsex.Text));
int fh = cmd.ExecuteNonQuery();
if (fh > ) MessageBox.Show("修改成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
this.Close();
}
}
}
修改人员中的保存按钮代码,跟点击添加按钮弹出的窗体中保存按钮代码一致,逻辑可能一时难以领悟,多看几遍就熟能生巧了!
右键菜单中删除按钮的代码:
if (dataGridView1.SelectedRows.Count > )
{
string xz = dataGridView1.SelectedRows[].Cells["id"].Value.ToString();
using (SqlConnection con = new SqlConnection(conStr))
{
con.Open();
string sql = string.Format("delete from B where id='{0}'", xz);
SqlCommand cmd = new SqlCommand(sql, con);
int fh = cmd.ExecuteNonQuery();
if (fh > )
{
MessageBox.Show("删除成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
sj();
rs();
}
else
{
MessageBox.Show("删除失败!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
sj();
rs();
}
}
增、删、改、查,的代码流程都大致相同:首先创建连接对象指定连接字符串,打开连接、sql语句在数据库里要做什么操作(增、删、改、查)、然后创建Command命令对象连接数据库并执行sql语句,定义一个变量来接收方法的返回值,增、删、改操作时,调用ExecuteNonQuer这个方法,查询操作时,一般调用的是ExcuteReader这个方法,要做的操作不同,调用的方法也会不同,定义变量时也得定义匹配这个方法的变量。
运行图:


一个简单的程序案例就讲解完了,写这篇博客也不求什么利益,只是希望能带给初学者一个启示作用,也许多年以后学了多门语言的自己,连最初的C#编程语言结构逻辑思维全都忘光了,还可以在博客上回忆一下,只要你一直在。
WinFrom开发小案例的更多相关文章
- Winfrom 开发小技能
1.放弃进度条.动态进度图片等方式实现用户体验优化方式(主要是优化用户等待体验),建议使用方式? 答:对于From或者Control而言,其提供了Cursor属性设置即可. 例如: this.Curs ...
- 20160410javaweb 开发小案例 --客户管理系统
客户管理系统---体验基于数据库javaweb的增删改查 添加客户 查询客户列表 修改客户信息 删除客户 条件查询客户信息 分页查询客户 javaee的经典三层架构--工厂类实现解耦 jsp+serv ...
- solr开发 小案例
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" ...
- (24/24) webpack小案例--自己动手用webpack构建一个React的开发环境
通过前面的学习,对webpack有了更深的认识,故此节我们就利用前面相关知识自己动手用webpack构建一个React的开发环境,就算是一个小案例吧. 注:此处使用的开发工具是Webstorm. 1. ...
- Vue3教程:用 Vue3 开发小程序,这里有一份实际的代码案例!
前言 寻寻觅觅冷冷清清,凄凄惨惨戚戚. Vue 3 发布以后,最近也在学习和写一些 Vue3 的 demo 和项目,我也一直想着什么时候能在小程序里使用新特性? 于是我翻遍了市面上的小程序框架,如 u ...
- 广播小案例-监听系统网络状态 --Android开发
本例通过广播实现简单的监听系统网络状态改变的小案例. 1.案例效果演示 当手机连网后,系统提示“已连接网络”, 当手机断网后,系统提示“当前网络不可用”. 2.案例实现 在主活动中动态注册广播,然后写 ...
- Session小案例------完成用户登录
Session小案例------完成用户登录 在项目开发中,用户登陆功能再平常只是啦,当用户完毕username和password校验后.进入主界面,须要在主界面中显示用户的信息,此时用ses ...
- MVC 小案例 -- 信息管理
前几次更新博客都是每次周日晚上到周一,这次是周一晚上开始写,肯定也是有原因的!那就是我的 Tomact 忽然报错,无法启动,错误信息如下!同时我的 win10 也崩了,重启之后连 WIFI 的标志也不 ...
- Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例
Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例 继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的 ...
随机推荐
- [国家集训队2012]middle(陈立杰)
我是萌萌的传送门 我是另一个萌萌的传送门 脑残错误毁一下午…… 其实题解早就烂大街了,然而很久之前我只知道是二分答案+主席树却想不出来这俩玩意儿怎么一块儿用的……今天又翻了几篇题解才恍然大悟,是把权值 ...
- 安装配置postgreSQL+pgcli+pgadmin3
记录了postgreSQL数据库的完整的安装配置过程,以及postgreSQL的pgcli命令行智能提醒扩展,pgadmin3图形化管理客户端的配置安装.此postgresql是bigsql版安装详情 ...
- OSGEarth加载 geoserver 发布 TMS
geoserver配好数据并用自带的gwc切片好后, 访问 http://localhost:9999/geoserver/gwc/service/tms/1.0.0/ 在OsgEarth的earth ...
- 【阿里云产品公测】ACE下上传文件永久存储实践
本帖主要内容: ;$,=VB:' 在阿里云的ACE下,我是如何实现让上传的文件永久保存的? ,%"!8T 本文以PHP为例,具体知识点如下: WD# 96V 第一,扩展服务“存储 ...
- ArcGIS for JavaScript 关于路径开发的一些记录(三)
最近被一个bug困扰了两天~ 我新发布了一个NAserver(路径分析服务),但是放在之前的代码里面发现不能生成路径.经过我的调试发现并没有代码并没有报错,并且能够返回所生成路径的Graphic la ...
- 分分钟搞懂 HD 钱包
转自:http://blog.sina.com.cn/s/blog_12ce70a430102v8c7.html 第一次看到 HD 这个词被用在比特币钱包中时,很容易就把它理解成硬件(Hardware ...
- 如何解决 Linux 虚拟机磁盘设备名不一致的问题
问题描述 在 Linux 虚拟机内,将附加的多块数据磁盘以设备名(/dev/sdxx)的方式创建文件系统,并将之写入 /etc/fstab 文件中实现启动自动挂载功能.但是在虚拟机重启之后,会随机出现 ...
- React - React Developer Tools开发者工具的安装与使用(Chrome调试插件)
原文地址:http://www.cnplugins.com/zhuanti/how-to-use-react-tools.html 虽然我们曾经在React开发者工具的基础介绍里面有概括性的介绍过Re ...
- Python初学者第六天 列表操作练习
6day 列表练习: 1.创建一个空列表,命名为names,往里面添加old_drilver,rain,jack,shanshan,peiqi,black_girl: names = [] names ...
- windows10下运行XX-net
现在墙高了,原来配置的ip4没法用了,所以重新配置一下XX-NET,这篇博客的内容参考了末尾的网站,如果我的办法行不通可以去这个网站查看其他方法 下载XX-NET 打开https://github.c ...