在近期的学习中,我们学习了泛型及泛型集合的概念和使用,泛型是c#中的一个重要概念,为了巩固我们学习的成果,我们可以使用一个实例来进行练习

题目及要求

要求使用Windows窗体应用程序,制作出如上图的界面,并实现增删改查的功能

StuInfo类的编写

同往常一样,在编写窗体的代码前,我们需要先编写一个StuInfo类用来存放学生的信息

StuInfo.cs代码如下:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace cs学生信息管理系统1121
{
class StuInfo
{
private string sno; //学号
private string name; //姓名
private string sclass; //班级
private string tele; //电话 //定义成员变量的索引器
public string Sno
{
get { return sno; }
set { sno = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
public string SClass
{
get { return sclass; }
set { sclass = value; }
}
public string Tele
{
get { return tele; }
set { tele = value; }
} //构造函数
public StuInfo(string sno, string name, string sclass, string tele)
{
Sno = sno;
Name = name;
SClass = sclass;
Tele = tele;
}
}
}

主窗体代码的编写

写好了StuInfo类之后,我们终于可以开始窗体应用程序的编写了,首先我们需要设置一下页面布局

页面布局及我的部分控件命名

接下来我们来编写代码

Form1.cs代码:

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace cs学生信息管理系统1121
{
public partial class Form1 : Form
{
//声明值为StuInfo类型数据的泛型字典StuDic
Dictionary<string, StuInfo> StuDic = new Dictionary<string, StuInfo>(); //显示数据方法
private void FillGrid(Dictionary<string, StuInfo> dic)
{
//如果数据网格中没有任何元素,则初始化
if(dataGridViewStuInfo.ColumnCount == )
{
//初始化一个新列
DataGridViewTextBoxColumn col_sno = new DataGridViewTextBoxColumn();
col_sno.HeaderText = "学号"; //设置标题
col_sno.DataPropertyName = "Sno"; //设置数据绑定文本
col_sno.Name = "sno"; //设置该列的名字 DataGridViewTextBoxColumn col_name = new DataGridViewTextBoxColumn();
col_name.HeaderText = "姓名";
col_name.DataPropertyName = "Name";
col_name.Name = "name"; DataGridViewTextBoxColumn col_class = new DataGridViewTextBoxColumn();
col_class.HeaderText = "班级";
col_class.DataPropertyName = "SClass";
col_class.Name = "class"; DataGridViewTextBoxColumn col_tele = new DataGridViewTextBoxColumn();
col_tele.HeaderText = "电话";
col_tele.DataPropertyName = "Tele";
col_tele.Name = "tele"; //向数据网格控件中加入我们刚才定义的列
dataGridViewStuInfo.Columns.Add(col_sno);
dataGridViewStuInfo.Columns.Add(col_name);
dataGridViewStuInfo.Columns.Add(col_class);
dataGridViewStuInfo.Columns.Add(col_tele);
}
//声明数据源绑定对象
BindingSource bs = new BindingSource();
bs.DataSource = dic.Values; //将我们数据字典中的元素绑定到bs中
dataGridViewStuInfo.DataSource = bs; //将bs中的数据与数据网格控件绑定
} public Form1()
{
InitializeComponent();
this.Text = "学生信息管理系统";
PanelEdit.Visible = false; //将编辑面板隐藏 //定义初始的数据
StuInfo zhang = new StuInfo("", "张三", "", "");
StuInfo luo = new StuInfo("", "罗辑", "", "");
StuInfo sun = new StuInfo("", "孙雪", "", "");
StuInfo wang = new StuInfo("", "王莱", "", ""); //将我们定义的数据加入到数据字典中
StuDic.Add(zhang.Sno, zhang);
StuDic.Add(luo.Sno, luo);
StuDic.Add(sun.Sno, sun);
StuDic.Add(wang.Sno, wang); FillGrid(StuDic); //显示数据
} //信息查询方法
private void ButtonQuery_Click(object sender, EventArgs e)
{
PanelEdit.Visible = false; //查询数据时关闭编辑面板
//如果输入框中没有输入数据,则默认显示所有数据
if(textBoxQuery.Text == "")
{
FillGrid(StuDic);
return;
}
//若找不到用户要查询的学生,则弹出错误提示
if(!StuDic.ContainsKey(textBoxQuery.Text))
{
MessageBox.Show("查无此人!", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
} StuInfo s = StuDic[textBoxQuery.Text]; //找出对应的学生信息
//创建一个新的数据字典,用于存放查询的结果
Dictionary<string, StuInfo> dic = new Dictionary<string, StuInfo>();
dic.Add(s.Sno, s);
FillGrid(dic); //显示数据
} //信息删除方法
private void ButtonDel_Click(object sender, EventArgs e)
{
PanelEdit.Visible = false; //删除数据时关闭编辑面板
//如果找不到用户要删除的数据,报错
if(!StuDic.ContainsKey(textBoxQuery.Text))
{
MessageBox.Show("您要删除的元素不存在!", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
} StuDic.Remove(textBoxQuery.Text); //删除数据
FillGrid(StuDic); //显示数据
} //修改数据方法
private void ButtonEdit_Click(object sender, EventArgs e)
{
if(!StuDic.ContainsKey(textBoxQuery.Text))
{
MessageBox.Show("您要修改的数据不存在!", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
} PanelEdit.Visible = true; //修改数据时开启编辑面板
textBoxStuNo.Enabled = false; //学号不允许修改 //新建对象存储要修改的元素
StuInfo s = StuDic[textBoxQuery.Text]; //将数据分别放到各个输入框中
textBoxName.Text = s.Name;
textBoxClass.Text = s.SClass;
textBoxStuNo.Text = s.Sno;
textBoxTele.Text = s.Tele;
} //添加数据方法
private void ButtonAdd_Click(object sender, EventArgs e)
{
//将所有输入框中的数据清零
textBoxStuNo.Text = "";
textBoxName.Text = "";
textBoxClass.Text = "";
textBoxTele.Text = ""; PanelEdit.Visible = true; //添加数据时开启编辑面板
textBoxStuNo.Enabled = true; //启用学号输入框
} //编辑面板区域的确定按钮事件
private void ButtonOK_Click(object sender, EventArgs e)
{
//实行添加方法时
if(textBoxStuNo.Enabled)
{
//要添加的学号已存在时,发出警告
if(StuDic.ContainsKey(textBoxStuNo.Text))
{
MessageBox.Show("学号已存在!", "警告",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
//填写信息不全时,发出警告
if(textBoxStuNo.Text == "" || textBoxName.Text == ""
|| textBoxClass.Text == "" || textBoxTele.Text == "")
{
MessageBox.Show("请将信息填写完整!", "警告",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
} //新建对象s用于存放待添加的数据
StuInfo s = new StuInfo(textBoxStuNo.Text, textBoxName.Text,
textBoxClass.Text, textBoxTele.Text);
StuDic.Add(s.Sno, s); //将数据添加进数据字典
}
//实行修改方法时
else
{
if(textBoxName.Text == "" || textBoxClass.Text == "" || textBoxTele.Text == "")
{
MessageBox.Show("请将信息填写完整!", "警告",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
} //先将数据删除再添加来实现修改
StuDic.Remove(textBoxStuNo.Text); //新建对象s用于存放待添加的数据
StuInfo s = new StuInfo(textBoxStuNo.Text, textBoxName.Text,
textBoxClass.Text, textBoxTele.Text);
StuDic.Add(s.Sno, s); //将数据添加进数据字典
} FillGrid(StuDic); //显示数据 //将所有输入框中的数据清零
textBoxStuNo.Text = "";
textBoxName.Text = "";
textBoxClass.Text = "";
textBoxTele.Text = ""; PanelEdit.Visible = false; //关闭编辑面板
} //取消按键
private void ButtonCel_Click(object sender, EventArgs e)
{
//将所有输入框中的数据清零
textBoxStuNo.Text = "";
textBoxName.Text = "";
textBoxClass.Text = "";
textBoxTele.Text = ""; PanelEdit.Visible = false; //关闭编辑面板
}
}
}

实际效果

查询

删除

修改

添加

关于一些问题的解答

为什么找不到PanelEdit

在我的页面布局的下半段,有一块被虚线围起来的部分,那块部分属于一个Panel控件,需要将他的名字改成PanelEdit

查询/删除等按键无效

很可能是你的控件事件没有和你的方法绑定,以查询为例,在Form1.cs[设计]中,右键点击查询按钮,在属性->事件->Click中,将其值改为ButtonQuery_Click,其他所有的按键都要进行同样的操作后才能使用。

我在Form1.cs中的ButtonQuery_Click等方法,都是通过双击设计界面的控件生成的,所以控件事件会自动和你的方法绑定,而如果你直接复制粘贴我的代码的话,就可能会产生没有绑定的情况。

c#简易学生信息管理系统的更多相关文章

  1. 基于数据库MySQL的简易学生信息管理系统

    通过这几天学习Mysql数据库,对其也有了基本的了解,为了加深印象,于是就写了一个最简易的学生信息管理系统. 一:基本要求 1.通过已知用户名和密码进行登录: 2.可以显示菜单: 3.可以随时插入学生 ...

  2. 一个低级shell简易学生信息管理系统-新增登陆注册功能

    还有bug 不修改了 小声bb一下 这玩意真的要控制版本 随手保存 本来有个超完整的版本 一开心被我rm - f 了 后续还出现了 更多的bug 仔细仔细 源码如下: record=stu.db if ...

  3. Python——面向对象,简易学生信息管理系统

    一.概述 1.1涉及到的知识点 项目开发:创建项目,创建包,导入包: 面向对象:静态方法,继承,内置函数,自定义函数: 数据类型:列表,字典,字符串.列表.字典的转换和自动生成导向: 异常处理:捕获异 ...

  4. Django 小实例S1 简易学生选课管理系统 7 修改个人信息

    Django 小实例S1 简易学生选课管理系统 第7节--修改个人信息 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 用户模块除了注册登录之外,还 ...

  5. Django 小实例S1 简易学生选课管理系统 12 CSS样式完善

    Django 小实例S1 简易学生选课管理系统 第12节--CSS样式完善 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 课程模块的逻辑代码到这里 ...

  6. Django 小实例S1 简易学生选课管理系统 11 学生课程业务实现

    Django 小实例S1 简易学生选课管理系统 第11节--学生课程业务实现 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 课程模块中,学生需要拥 ...

  7. Django 小实例S1 简易学生选课管理系统 10 老师课程业务实现

    Django 小实例S1 简易学生选课管理系统 第10节--老师课程业务实现 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 课程模块中,老师将要使 ...

  8. Django 小实例S1 简易学生选课管理系统 8 CSS样式优化

    Django 小实例S1 简易学生选课管理系统 第8节--CSS样式优化 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 前面的几节下来,用户模块基 ...

  9. Django 小实例S1 简易学生选课管理系统 6 实现登录逻辑

    Django 小实例S1 简易学生选课管理系统 第6节--实现登录逻辑 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 1 业务逻辑 本教程第四节里 ...

随机推荐

  1. jetbrains全家桶永久激活大法

    不得不说jetbrains的产品真的挺好用的,比如耳熟能详的idea和pycharm等等,但正版的费用真的非我等学生党所能承担,网上也有一些注册码的教程,原理是通过服务器进行注册认证,但貌似目前用的比 ...

  2. Maven实战(十)利用 Nexus 来构建企业级 Maven 仓库

    目录 一.简介 Nexus是Maven仓库管理器,用来搭建一个本地仓库服务器,这样做的好处是便于管理,节省网络资源,速度快,还有一个非常有用的功能就是可以通过项目的SNAPSHOT版本管理,来进行模块 ...

  3. Golang Http Server源码阅读

    建议看这篇文章前先看一下net/http文档 http://golang.org/pkg/net/http/ net.http包里面有很多文件,都是和http协议相关的,比如设置cookie,head ...

  4. BZOJ2729:[HNOI2012]排队(组合数学)

    Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不 ...

  5. 【LGP4886 】快递员

    题目 好秒啊,真是一道神仙的点分治 于是我们来一个暴力的\(O(nlog^2n)\)的暴力统计吧 考虑计算每一个点作为快递中心时的答案 我们考虑在这个点成为分治重心时计算这个贡献 把这个贡献分成两部分 ...

  6. android scheme打开天猫,淘宝

    直接上代码 Intent intent = new Intent(); intent.setAction("android.intent.action.VIEW"); /* Str ...

  7. MySQL IFNULL基本用法

    MySQL IFNULL函数是MySQL控制流函数之一,它接受两个参数,如果不是NULL,则返回第一个参数. 否则,IFNULL函数返回第二个参数. 两个参数可以是文字值或表达式. 以下说明了IFNU ...

  8. logstash 匹配日志格式

    2017-05-15 12:06:17 INFO  me.cinyi.imapp.push.commons.iospush  - 用户ID[1000]-标识[11500], admin推送通知成功, ...

  9. 分布式唯一ID的几种生成方案

    前言 在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID.退款ID等.那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是十 ...

  10. centos中安装、升级git

    yum install git 若是从老版本升级,则按下面方法.(centos中) 先更新系统sudo yum update     安装依赖的包yum install curl-devel expa ...