在近期的学习中,我们学习了泛型及泛型集合的概念和使用,泛型是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. 关于for...in和for...of的思考

    关于for...in和for...of的思考 在编写js代码的时候,我们经常性的要对数据集合进行遍历,Array.Object.以及ES6新属性Map.Set,甚至String类型都是可遍历的. 我们 ...

  2. Array.prototype.reduce 的理解与实现

    Array.prototype.reduce 是 JavaScript 中比较实用的一个函数,但是很多人都没有使用过它,因为 reduce 能做的事情其实 forEach 或者 map 函数也能做,而 ...

  3. Hive学习之路 (九)Hive的内置函数

    数学函数 Return Type Name (Signature) Description DOUBLE round(DOUBLE a) Returns the rounded BIGINT valu ...

  4. Hadoop学习之路(六)HDFS基础

    HDFS前言 HDFS:Hadoop Distributed File System ,Hadoop分布式文件系统,主要用来解决海量数据的存储问题 设计思想 1.分散均匀存储 dfs.blocksiz ...

  5. React 如何正常渲染一段HTML字符串

    dangerouslySetInnerHTMl 属性 很多时候我们做一个项目接口会返回一段 HTML 字符串文本,然后我们把它解析渲染成正常的html,这是在项目中常见不能再常见的情况了,可是在 re ...

  6. 20145203盖泽双 《Java程序设计》第6周学习总结

    20145203盖泽双 <Java程序设计>第6周学习总结 教材学习内容总结 1.如果要将数据从来源中取出,可以使用输入串流,若将数据写入目地, 可以使用输出串流.在java中,输入串流代 ...

  7. github与git基本操作(一)

    一.git上传本地项目到github 前提:github创建一个空仓库(得到“https://自己的仓库url地址”)1.第一步:就是要进入这个目录下,cmd2.第二步:输入git init3.第三步 ...

  8. c++——对象的动态建立和释放(new 和delete)

    3.8 对象的动态建立和释放 1 new和delete基本语法 1)在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来 ...

  9. 支持xhr浏览器:超时设定、加载事件、进度事件

    各个浏览器虽然都支持xhr,但还是有些差异. 1.超时设定 IE8为xhr对象添加了一个timeout属性,表示请求在等待响应多少毫秒后就终止.再给timeout这只一个数值后,如果在规定的时间内浏览 ...

  10. .Net实现Word文档及导出

    参考网址: http://www.jb51.net/article/25062.htm(实用性) http://wenku.baidu.com/link?url=44O7Dua49DrZ-PF2QU7 ...