在近期的学习中,我们学习了泛型及泛型集合的概念和使用,泛型是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. MySQL知识总结(三)存储过程

    1. 创建存储过程 1.1 无参数存储过程 CREATE PROCEDURE bruce_procedure () BEGIN --1.声明变量 --2.执行业务逻辑 END 1.2 有参数的存储过程 ...

  2. HAproxy.md

    HAProxy HAProxy是什么 HAProxy(High Available Proxy)是基于四层和七层的高可用负载均衡代理服务器,配置简单.支持多达上万条并发请求. HAProxy工作原理 ...

  3. BZOJ3052:[WC2013]糖果公园(树上莫队)

    Description Input Output Sample Input 4 3 51 9 27 6 5 12 33 13 41 2 3 21 1 21 4 20 2 11 1 21 4 2 Sam ...

  4. 微信小程序、安卓APP、苹果APP对比分析

    今天的话题主要是关于微信小程序.安卓APP.苹果APP对比分析.既然是对比分析肯定是将它们一个一个说明. 本篇不涉及技术话题,只讲解微信小程序.安卓APP.苹果APP它们各自的优缺点及其应用场景. 一 ...

  5. 多线程之Lock

    Java并发编程:Lock 在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.l ...

  6. error: OpenCV Error: Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows) in cv::Mat::Mat

    问题原因: You are probably working outside of the image dimensions. Does any of the values you pass to t ...

  7. 安装vue

    node.js环境(npm包管理器) vue-cli 脚手架构建工具 cnpm npm的淘宝镜像 1) 安装node.js 从node.js官网下载并安装node,安装过程很简单,一直点下一步就ok了 ...

  8. 第一章 Linux内核简介

    1. 操作系统和内核 操作系统是指在整个系统中负责完成最基本功能和系统管理的那些部分.包括内核.设备驱动程序.启动引导程序.命令行shell或者其他种类的用户界面.基本的文件管理工具和系统工具. 用户 ...

  9. SharePoint中跨列表查询

    1,最近的项目中遇到一个需求,站点中有几十个列表,其中每5,6个列表属于一个模块下的.客户的需求是,首页上显示一个模块下所有列表数据的前5条,并按创建时间排序. 2,刚刚考虑到这块的实现方法时,用的是 ...

  10. Centos 模拟生成文件的脚本

    #!/bin/sh count= #控制每秒写入不同大小的文件 while true do ;i<=$count;i++)) do /bin/-`.jpg done ;i<=$count; ...