项目实训-学生信息管理系统

更新时间:2024-06-25 03:12:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

项目实训

学生信息管理系统设计与实现

前言:项目概述

学生信息管理系统介绍 项目名称 代码量 项目简介 学生信息管理系统 3000行 该系统可以帮助教辅人员进行学生基本信息的日常管理和维护;进行学生选课模拟以及重要数据备份等功能。 ① 掌握WinForm图形用户界面开发技术 ② 掌握ADO.NET数据库访问技术 WinForm、ADO.NET、SQL Server Microsoft SQL Server 2000 Visual Studio 2005 ① 基于.NET采用C#语言开发 ② 项目属于C/S结构程序 ① WinForm窗体主要控件的应用 ② 数据库各类对象的应用,例如:存储过程、触发器等 ADO.NET数据库访问技术 项目目的 涉及的主要技术 数据库环境 编程环境 项目特点 技术重点 技术难点 C/S结构项目实训(C#语言版) 1

1 项目需求以及分析设计

1.1 项目需求分析

随着学校规模的不断扩大,每个院系的专业、班级、学生的数量急剧增加,有关学生选课的各种信息量也成倍增长,而很多高校的学生信息管理工作仍停留在复杂的人工操作上,重复工作较多,工作量大,效率低。因此,迫切需要开发学生信息管理系统来提高管理工作的效率。

经过详细调研,我们确定了一个简易的学生信息管理系统的基本需求。 ① 需要进行身份认证登录

系统只允许合法用户进行登陆操作,并且该系统主要面向教学管理人员提供服务(例如教学秘书、辅导员等)。合法用户登陆后可以进行系统的主要功能操作。

② 数据查询服务

系统需要为服务对象提供两种服务:一是进行学生基本信息的浏览;二是进行学生成绩信息查询服务。

③ 数据添加服务

系统根据需要可以添加学生基本信息以及添加学生的选课信息等操作。 ④ 数据更新服务

系统根据需要可以更新学生的基本信息。 ⑤ 数据删除服务

系统根据需要可以删除学生的基本信息,但是要求备份删除学生的所有信息。 ⑥ 系统扩展服务

本项目限于篇幅等,在后面主要描述并实现了系统登录、学生基本信息浏览、成绩信息查询、学生基本信息的添加、更新和删除以及学生选课的功能。有关其他实体信息的管理,例如:成绩信息、课程信息等维护功能没有实现。但是大家完全可以根据后面系统提供的框架来扩展系统的其他功能。

此外,根据需要,我们采用基于C/S结构来开发学生信息管理系统。

1.2 项目功能描述

C/S结构项目实训(C#语言版)

2

根据需求分析,学生信息管理系统为用户提供的功能主要分为以下几类: 系统管理服务:系统系统登录、注销以及系统退出功能。

数据查询和统计服务:学生基本信息浏览和查询、学生成绩信息查询等功能。 数据添加服务:学生基本信息添加、学生选课、其他可以扩展的功能(院系信息添加、课程信息添加、成绩信息添加、管理员账户信息添加等未实现)。

数据更新服务:学生基本信息更新、其他可以扩展的功能(院系信息更新、课程信息更新、成绩信息更新、管理员密码修改功能等未实现)。

数据删除服务:学生基本信息删除、其他可以扩展的功能(院系信息删除、课程信息删除、成绩信息删除、管理员删除等功能未实现)。

系统介绍服务:系统基本信息介绍、系统使用帮助(未实现)等。

根据以上系统功能描述,绘制学生信息管理系统的功能模块划分如图14.1.2-1所示。

系统登录 系统管理 注销 退出 学生基本信息浏览 学生信息管理系统C/S结构项目实训(C#语言版)

数据查询和统计 学生成绩信息查询 其他功能扩展 学生基本信息添加 数据添加 学生选课 其他功能扩展 学生基本信息更新 其他功能扩展 学生基本信息删除 其他功能扩展 关于本系统 其他功能扩展 数据更新 数据删除 帮助 图1.2-1:“学生信息管理系统”功能模块图

3

1.3 数据库设计

本系统后台数据库采用的是SQL Server 2000,根据系统的功能描述以及系统的详细设计,学生成绩信息管理系统中各种数据信息之间的关系如图1.3-1所示。

图1.3-1:“学生成绩信息管理系统”数据库关系图

下面针对图1.3-1中的数据库基本表的具体设计进行详细介绍。 表名:admin(管理员表),如表1.3-1所示。 字段名称 userName password 数据类型 字段说明 主键 限制最低6位,不能为空 字段属性 Varchar(20) 用户名 Varchar(20) 密码 表1.3-1:管理员表设计说明

表名:Dept(院系表),如表1.3-2所示。 字段名称 数据类型 deptID Char(4) 字段说明 院系编号 院系名称 联系电话 主键 不许为空且唯一 字段属性 deptName Nvarchar(30) phone Varchar(12) 表1.3-2:院系表设计说明

C/S结构项目实训(C#语言版)

4

表名:stu(学生表),如表1.3-3所示。 字段名称 stuID stuName stuSex stuBirth 数据类型 Nvarchar(20) Datetime 字段说明 主键 不许为空 只能输入:男、女 要求年龄不能大于30岁 只能输入1、2、3(其中1表示党员,2表示团员,3表示其他) 参照院系表院系编号取值 姓名 字段属性 Char(12) 学号 Nchar(1) 性别 出生日期 政治面貌 stuPolitic Tinyint stuDept stuResume stuPhoto stuPcard Char(4) 所属院系 Ntext Image 简历 照片 Char(18) 身份证编号 表1.3-3:学生表设计说明

表名:course(课程表),如表1.3-4所示。 字段名称 courseID courseName Credit courseTime stuLimited stuPreSelect 数据类型 Char(6) 字段说明 课程编号 主键 字段属性 Nvarchar(30) 课程名称 不许为空,唯一 Tinyint 学分 其值不能大于5 Varchar(30) 上课时间 Tinyint Tinyint 限选人数 默认值:250 已选人数 默认值:0,并且不能大于stuLimited 表1.3-4:课程表设计说明

表名:grade(成绩表),如表1.3-5所示。 字段名称 stuID 数据类型 字段说明 学号 课程编号 字段属性 参照学生表学号字段取值 参照课程表课程编号字段取值 成绩必须介于0和100之间 Char(12) courseID Char(6) grade Decimal(5,2) 成绩 说明:stuID和courseID联合主键 表1.3-5:成绩表设计说明

2 项目详细设计以及功能实现

C/S结构项目实训(C#语言版) 5

本章主要任务是从实际应用出发,使学生能够掌握SQL Server 等大型数据库技术,掌握C#+SQL Server等大型数据库软件进行大型数据库桌面应用程序开发的基本过程和基本方法,并能够运用C#进行简单的办公自动化系统编程。

在进行项目详细设计之前,首先创建一个名为StuInfoManage的windows应用程序项目。

2.1 数据库通用访问类的创建

考虑到整个项目中多个窗体的很多位置都需要涉及到数据库的访问操作,所以我们将数据库操作频繁使用的部分代码抽取出来,组合而成数据库访问类,从而避免重复编写相同代码的工作。

常见的数据库访问操作主要有:更新操作(包括插入数据、修改数据和删除数据)、查询操作(指直接执行SQL语句进行数据库操作)、存储过程的执行操作(主要包括返回结果集的存储过程以及使用返回值的存储过程)等。

在StuInfoManage项目中进行以下操作:

① 添加一个类:将其中创建的Class1.cs重命名为SqlHelper.cs。 ② 在该类中添加如下代码:

public class abstract class SqlHelper {

//获取数据库连接字符串,其属于静态变量且只读,项目中所有文档可以直接使用,但不能修改

public static readonly string ConnectionString = \= .;database=stuInfoManage;Integrated Security = true;\;

/// 执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。 public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {

SqlCommand cmd = new SqlCommand();

using (SqlConnection conn = new SqlConnection(connectionString)) {

//通过PrePareCommand方法将参数逐个加入到SqlCommand的参数集合中 PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); int val = cmd.ExecuteNonQuery(); //清空SqlCommand中的参数列表 cmd.Parameters.Clear(); return val; } }

C/S结构项目实训(C#语言版)

6

/// 执行一条返回SqlDataReader的SqlCommand命令,通过专用的连接字符串。 public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {

SqlCommand cmd = new SqlCommand();

SqlConnection conn = new SqlConnection(connectionString); try {

PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); cmd.Parameters.Clear(); return rdr; } catch {

conn.Close(); throw; }

/// 执行一条返回DataSet的SqlCommand命令,通过专用的连接字符串。 public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters) {

SqlCommand cmd = new SqlCommand();

using (SqlConnection cn = new SqlConnection(connectionString)) {

cn.Open();

PrepareCommand(cmd, cn, (SqlTransaction)null, commandType, commandText, commandParameters);

SqlDataAdapter da = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); da.Fill(ds); cmd.Parameters.Clear(); return ds; } }

/// 为执行命令准备参数

private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) {

//判断数据库连接状态

if (conn.State != ConnectionState.Open) conn.Open();

cmd.Connection = conn;

C/S结构项目实训(C#语言版)

7

cmd.CommandText = cmdText; //判断是否需要事物处理 if (trans != null)

cmd.Transaction = trans; cmd.CommandType = cmdType; if (cmdParms != null) {

foreach (SqlParameter parm in cmdParms) cmd.Parameters.Add(parm); } } /*

* 功能:调用存储过程,并返回存储过程返回值的通用方法

*

*

* * 返回存储过程的返回值 */

public int ProcReturnValue(string procName, SqlParameter[] cmdparam,int DataOpType) {

SqlConnection sqlconn=new SqlConnection(ConnectionString); try {

if (sqlconn.State != ConnectionState.Open) {

sqlconn.Open(); }

SqlCommand sqlcmd = new SqlCommand(); sqlcmd.Connection = sqlconn; sqlcmd.CommandText = procName;

sqlcmd.CommandType = CommandType.StoredProcedure;

if (cmdparam != null) {

foreach (SqlParameter param in cmdparam) sqlcmd.Parameters.Add(param); }

sqlcmd.Parameters.Add(new

SqlParameter(\,SqlDbType.TinyInt));

sqlcmd.Parameters[\].Direction = ParameterDirection.ReturnValue;

C/S结构项目实训(C#语言版)

8

if (DataOpType == 1) {

sqlcmd.ExecuteScalar(); }

if(DataOpType == 2) {

sqlcmd.ExecuteNonQuery(); }

return Convert.ToByte(sqlcmd.Parameters[\].Value); } catch

{ throw; }

finally {

sqlconn.Close(); } }

}

至此,数据库通用访问类创建完毕。我们可以用此类完成几乎所有的数据库操作。

2.2 系统主界面设计与功能实现

(1)界面设计的基本要求

① 界面设计要完整的体现用户的功能需求,并且美观大方。 ② 界面设计的交互操作过程符合用户的习惯性工作过程。 (2)系统主界面设计

在stuInfoManage项目中将Form1.cs重命名为MainForm.cs,并参照表格2.2-1的说明设置MainForm窗体的属性。

属性名 IsMdiContainer Text StartPosition WindowState True 学生信息管理系统 CenterScreen Maximized 表格2.2-1:主窗体主要参数设置

设置 C/S结构项目实训(C#语言版) 9

(3)系统菜单设计

根据需求,系统需要在主窗体上创建一个菜单系统来引导用户的操作,至于菜单系统中的各级菜单显示字符以及命名参见表格2.2-2说明。

主菜单 系统管理 数据查询 数据添加 数据更新 数据删除 帮助 系统登陆 注销 退出 学生基本信息浏览 学生成绩信息查询 课程成绩信息查询 学生基本信息添加 学生基本信息更新 学生基本信息删除 关于本系统 子菜单 命名 SystemManageMenuItem LoginInMenuItem LoginOutMenuItem SystemExitMenuItem DataQueryMenuItem StuBasicInfoQueryMenuItem StuGradeInfoQueryMenuItem CourseGradeQueryMenuItem DataAddMenuItem StuBasicInfoInsertMenuItem DataUpdateMenuItem StuBasicInfoUpdateMenuItem DataDeleteMenuItem StuBasicInfoDeleteMenuItem HelpMenuItem AboutSystemMenuItem 表格: 2.2-2 菜单系统主要参数设置

(4)系统菜单功能初始状态的设定

由于该系统需要合法用户登陆成功后才能操作相应的系统主要功能,所以系统的主要功能的初始状态是不可用的。此外,当系统登录成功后需要打开系统主要功能锁定。为了实现该功能以及方便以后操作,首先在MainForm类中添加以下两个私有方法:

//将系统主要功能调用的菜单锁定的方法 private void MenuStatusOFF() {

DataQueryMenuItem.Enabled = false; DataAddMenuItem.Enabled = false;

C/S结构项目实训(C#语言版)

10

DataUpdateMenuItem.Enabled = false; DataDeleteMenuItem.Enabled = false;

}

//打开系统主要功能锁定状态的方法

private void MenuStatusOn() {

DataQueryMenuItem.Enabled = true; DataAddMenuItem.Enabled = true; DataUpdateMenuItem.Enabled = true; DataDeleteMenuItem.Enabled = true;

}

然后,双击MainForm窗体类的Load事件,在该事件中添加如下代码: MenuStatusOFF(); (5)“注销”功能的实现

功能:将系统主要功能设置为锁定状态,以方便其他用户登陆使用。 具体操作:选中“注销”菜单,在注销菜单的Click事件中添加如下代码。 MenuStatusOFF(); (6)“退出”功能的实现

当系统退出时,需要提示是否真的退出等提示选项等,实现该功能在MainForm窗体类中进行如下操作:

① 在“退出”菜单的Click事件中添加如下代码: this.Close();

② 在MainForm窗体类的FormClosing事件中添加如下代码:

DialogResult mgr = MessageBox.Show(\您确定要退出学生信息管理系统吗?\,

\信息提示\,

MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);

if (mgr == DialogResult.Cancel)

e.Cancel = true;

至此,系统主界面以及菜单系统的主要设计任务已经完毕。

2.3 登录窗体的设计与功能实现

(1)功能描述

该步骤要实现两个功能:

C/S结构项目实训(C#语言版)

11

1、点击“系统管理”主菜单下“系统登录”功能选项,打开“系统登陆”窗体;在该窗体处于打开状态时,我们不能操作主界面包括系统菜单的所有功能,除非关闭该窗体以后,才能继续操作;

2、系统启动完成后,系统主要功能处于不可用状态,当登陆成功后,打开功能锁定。 在本案例中,解决第一个问题的方法是使用模式对话框,解决第二个问题的方法是在登陆窗体中设置一个“系统菜单状态”变量(SysMenuStatus),通过该变量的真假来判断是否打开系统的功能锁定。

(2)流程图

针对功能描述,我们绘制系统登录功能的操作流程图如图2.3-1所示。

主菜单:系统管理 启动主窗体 提示登录成功信息,打开子菜单:系统登陆功能菜单锁定并结束 成功 输入用户名和密码 登陆 数据验证 失败信息提示 图2.3-1:“系统登录”功能实现流程图

(3)数据库设计

本窗体主要功能的实现所涉及的用户登陆合法性验证采用带返回值的存储过程来实现。具体操作过程为:在SQLServer查询分析器中输入以下代码后并运行,创建存储过程LoginJudge,用于判断登陆用户的合法性验证。

Use stuInfoManage

If exists(select * from sysobjects where name = ‘LoginJudge’ and type = ‘P’)

Drop procedure LoginJudge

12

C/S结构项目实训(C#语言版)

go

create procedure LoginJudge ( ) as

if not exists(select * from admin where userName = @userName)

return 1 -- 表示不存在该用户 @userName nvarchar(100), @passWord varchar(100)

else begin

if not exists(select * from admin where userName = @userName and

[password]=@passWord )

return 2 --表示密码错误

else

return 3 --表示登陆成功

end GO

代码输入完毕后点击运行按钮,生成LoginJudge存储过程。 (4)界面设计

首先,在stuInfoManage项目中添加一个Windows窗体,将其窗体类名改为:SystemLoginForm,设置该窗体的属性Text为“系统登录”,并添加一个公共数据成员:

public Boolean SysMenuStatus = false;

其次,在该“系统登录”窗体上添加必要控件并设置相关属性,具体设置参照表格14.2.3-1说明。 控件类型 Lable1 Lable2 Lable3 采用系统默认 采用系统默认 采用系统默认 命名 属性 Text:系统登陆 Text:用户名: Text:密码: C/S结构项目实训(C#语言版) 13

ComboBox TextBox Button Button Button UserNameComboBox PasswordTextBox LoginButton ResetButton ExitButton 无 PasswordChar:* Text:登陆 Text:重置 Text:退出 表格14.2.3-1:“系统登录”窗体上面控件的主要属性设置表格

其他显示样式以及效果可以根据实际情况具体调节,例如字体的大小和颜色等。具体设计效果可以参照图2.3-2。

图2.3-2:“系统登录”窗体设计效果图

(5)代码实现

5.1 菜单功能调用的实现

首先,在系统主界面类MainForm类中添加一个私有数据成员,该成员为系统登陆窗体的一个实例,即在MainForm类中添加如下代码:

SystemLoginForm LoginForm = new SystemLoginForm();

其次,双击“系统登陆”菜单,在“系统登陆”菜单的Click事件中添加以下代码: //判断该对象是否存在,如果不存在,就创建它 if (LoginForm.IsDisposed)

C/S结构项目实训(C#语言版)

14

{

LoginForm = new SystemLoginForm(); }

//以模式对话框的形式显示LoginForm窗体 LoginForm.ShowDialog();

//登陆窗体运行完毕后,判断登陆窗体的属性SysMenuStatus的取值

//如果登陆窗体中系统菜单状态变量的值为真,打开系统菜单主要功能的锁定状态 if (LoginForm.SysMenuStatus == true)

{

MenuStatusOn(); } 至此,登录窗体的功能调用已经实现。 5.2 “登陆窗体”相应功能的实现 ① “用户名”组合框的数据初始化

系统界面启动后,自动加载数据库中合法的管理员的用户名,在用户名组合框中列示以便选择,当然也允许用户自行输入个人的用户名。

实现该功能需要在SystemLoginForm窗体类的Load事件中添加以下代码,为UserNameComboBox数据进行初始化操作:

string sqlstr = \; DataSet userNameDS =

SqlHelper.ExecuteDataset(SqlHelper.ConnectionString,CommandType.Text,sqlstr); UserNameComboBox.DataSource = userNameDS.Tables[0];

UserNameComboBox.DisplayMember = \;

② “系统登陆”窗体的初始化

我们在启动系统登录窗体后,要使各个控件处于数据选择或输入状态。要实现该功能,首先,我们需要在SystemLoginForm窗体类中添加私有方法用于控件初始状态设定:

private void ComponentReset()

{

UserNameComboBox.Text = \; PasswordTextBox.Text = \; UserNameComboBox.Focus();

}

然后在SystemLoginForm窗体的载入事件中添加该方法的调用: ComponentReset(); ③ “重置”按钮功能的实现

C/S结构项目实训(C#语言版) 15

重置功能主要实现清空已经输入或选择的数据,以便用户重新输入。完成此功能,需要在“重置”按钮的Click事件中添加以下代码实现控件状态重置:

ComponentReset(); ④ “退出”按钮功能的实现

在“退出”按钮的Click事件中添加以下代码: this.Close();

⑤ “登陆”按钮功能的实现

点击登陆按钮后,首先要根据需要判断用户名和密码是否非空,密码长度是否大于6位。如果违反这些基本条件,直接给出相应提示信息。如果具备这些基本条件,则调用存储过程LoginJudge判断用户的合法性,并根据返回值进行应有的操作和相应的提示信息。

实现该功能,需要在“登陆”按钮的Click事件中添加如下代码:

private void LoginButton_Click(object sender, EventArgs e)

{

string userName = UserNameComboBox.Text.Trim(); string passWord = PasswordTextBox.Text.Trim();

if (userName.Length == 0)

{

MessageBox.Show(\用户名不能为空!请重新输入!!!\, \信息提示\,

MessageBoxButtons.OK,MessageBoxIcon.Warning);

UserNameComboBox.Focus(); } else {

if (passWord.Length == 0)

{

MessageBox.Show(\密码不能为空!请重新输入!!!\,\信息提示

\, MessageBoxButtons.OK,MessageBoxIcon.Warning);

PasswordTextBox.Text = \; PasswordTextBox.Focus(); }

else if (passWord.Length < 6)

{

MessageBox.Show(\密码长度不能短于6位,请重新输入!!!\, \

信息提示\, MessageBoxButtons.OK,MessageBoxIcon.Warning);

PasswordTextBox.Text = \

C/S结构项目实训(C#语言版)

16

PasswordTextBox.Focus();

} else {

SqlParameter[] cmdparam = new SqlParameter[]{

new SqlParameter(\,userName), new SqlParameter(\,passWord) };

int loginFlag =

SqlHelper.ProcReturnValue(\, cmdparam,1); switch (loginFlag)

{

case 1:

MessageBox.Show(\不存在该用户,请重新输入或者选择你

要登陆的用户名!!!\, \信息提示\, MessageBoxButtons.OK, MessageBoxIcon.Warning);

ComponentReset(); break; case 2:

MessageBox.Show(\用户名存在,但密码输入密码错误!!!\, \信息提示\, MessageBoxButtons.OK, MessageBoxIcon.Warning);

PasswordTextBox.Clear(); PasswordTextBox.Focus(); break; case 3:

MessageBox.Show(\恭喜您,登陆成功!!!\, \信息提示\, MessageBoxButtons.OK,MessageBoxIcon.Information); SysMenuStatus = true; this.Close(); break; } }

} }

至此,“系统登陆”功能基本实现。

2.4 学生基本信息浏览窗体的设计与功能实现

(1)功能描述

本步骤主要功能是逐个浏览数据库中保存的学生基本信息。该功能窗体启动后列示第一个学生的基本信息,如果不存在则给出相应提示。此后可以根据界面上“第一条”、“上一条”、

C/S结构项目实训(C#语言版) 17

“下一条”、“最后一条”导航按钮来浏览学生基本信息的数据。

(2)数据库设计

根据需求描述,我们在该窗体上浏览的学生基本信息包括:学号、姓名、性别、政治面貌、出生日期、所在院系名称、身份证编号、简历和照片等信息。

该功能的实现计划从视图获取我们需要的数据。根据分析我们需要在数据库中创建一个用于查询以上学生基本信息数据的视图:stuBasicInfoView

(3)界面设计

首先在stuInfoManage项目中添加一个Windows窗体,将窗体类名修改为:

StuBasicInfoQueryForm,设置该窗体的属性Text为“学生基本信息浏览”,并在该Windows窗体上添加以下控件并设置属性,具体的控件及其主要属性设置可参照表2.4-1说明。

控件类型 Label Label Label Label Label Label Label Label Panel Panel Panel RatioButton RatioButton RatioButton RatioButton RatioButton PictureBox Text 控件名称 系统默认 系统默认 系统默认 系统默认 系统默认 系统默认 系统默认 系统默认 系统默认 系统默认 系统默认 MaleRatioButton FemaleRadioButton DYRatioButton TYRadioButton OtherRatioButton StuPhotoPictureBox StuIDTextBox 控件主要属性设置 Text:学生基本信息浏览 Text:学号: Text:姓名: Text:性别: Text:政治面貌: Text:出生日期: Text:院系名称: Text:身份证编号 BorderStyle:Fixed3D BorderStyle:Fixed3D BorderStyle:Fixed3D Text:男 Text:女 Text:党员 Text:团员 Text:其他 BorderStyle:Fixed3D 无 C/S结构项目实训(C#语言版) 18

Text Text Text Text Text Button Button Button Button StuNameTextBox StuBirthTextBox DeptNameTextBox StuCardTextBox StuResumeTextBox FirstRecorButton PriorRecordButton NextRecordButton LastRecordButton 无 无 无 无 MultiLine:true Text:第一条 Text:上一条 Text:下一条 Text:最后一条 表2.4-1:“学生基本信息浏览”窗体的控件及其主要属性设置说明

注意:性别和政治面貌的单选按钮必须按类别放在相应的Panel上面,否则单选按钮的功能可能不能表达我们的期望;为了界面美观,关于颜色和字体大小的设置大家根据实际情况进行设置;我们必须按意义将相应的控件进行排列(例如学号标签和学号文本框要对应),否则导致意义不明确。具体界面设计效果可参照图2.4-1。

C/S结构项目实训(C#语言版) 19

图14.2.4-1:“学生基本信息浏览”设计效果图

(4)代码实现

4.1 菜单功能调用的实现

程序中所有功能子窗体的调用将呈现MDI效果。为了实现MDI效果,首先在MainForm窗体类中添加StuBasicInfoQueryForm窗体类的一个实例。

StuBasicInfoQueryForm BasicInfoQueryForm = new StuBasicInfoQueryForm(); 然后,在菜单“学生基本信息浏览”的Click事件中添加功能调用 if (BasicInfoQueryForm.IsDisposed)

{

BasicInfoQueryForm = new StuBasicInfoQueryForm();

}

BasicInfoQueryForm.MdiParent = this; BasicInfoQueryForm.Show(); BasicInfoQueryForm.Focus();

C/S结构项目实训(C#语言版)

20

4.2 “学生基本信息浏览窗体”功能的实现 ① 窗体的初始化工作

窗体中四个导航按钮控件都要从结果集中读取学生的基本信息,并需要确定正在操作的当前学生的具体位置。为此,我们首先定义两个私有数据成员用于保存该窗体运行过程中的数据集合和当前记录的位置。具体操作为:在StuBasicInfoQueryForm窗体类中添加以下代码。

DataSet StuBasicInfoDS = new DataSet(); // 保存该窗体涉及的数据集 int currentRecord = 0; // 保存当前操作的记录位置 其次,我们需要初始化窗体数据查询结果集以及设置界面打开状态。

第一步,创建一个通用的界面数据绑定的私有方法,该方法根据查询结果集中学生的具体位置,在窗体的相应控件上展示该学生的详细信息。具体操作即在StuBasicInfoQueryForm类中添加以下代码:

private void CoverDataBind(int position) {

DataRow dr = StuBasicInfoDS.Tables[0].Rows[position]; StuIDTextBox.Text = dr[\].ToString(); StuNameTextBox.Text = dr[\].ToString(); StuBirthTextBox.Text = dr[\].ToString(); DeptNameTextBox.Text = dr[\].ToString(); StuCardTextBox.Text = dr[\].ToString(); StuResumeTextBox.Text = dr[\].ToString();

if (dr[\].ToString().Equals(\男\)) {

MaleRatioButton.Enabled = true; MaleRatioButton.Checked = true; FemaleRadioButton.Enabled = false; } else {

MaleRatioButton.Enabled = false;

C/S结构项目实训(C#语言版)

21

FemaleRadioButton.Enabled = true; FemaleRadioButton.Checked = true; }

switch(dr[\].ToString()) {

case \:

DYRatioButton.Enabled = true; DYRatioButton.Checked = true;

TYRadioButton.Enabled = false; OtherRatioButton.Enabled = false; break; case \:

DYRatioButton.Enabled = false; OtherRatioButton.Enabled = false;

TYRadioButton.Enabled = true ; TYRadioButton.Checked = true ; break; case \:

OtherRatioButton.Enabled = true; OtherRatioButton.Checked = true;

DYRatioButton.Enabled = false; TYRadioButton.Enabled = false; break; }

//图片数据的显示 try

C/S结构项目实训(C#语言版)

22

{

byte[] PhotoBuffer = (byte[])dr[\]; Stream Photo = new MemoryStream(PhotoBuffer); Image PhotoImage = Image.FromStream(Photo, true); StuPhotoPictureBox.Image = PhotoImage; Photo.Close(); } catch {

StuPhotoPictureBox.Image = null; }

}

第二步,我们从数据库中读取学生基本信息数据,如果有学生,则在窗体启动后列示第一个学生的基本信息,如果没有则提示相关信息。为此,我们需要在StuBasicInfoQueryForm的Load事件中添加以下代码:

private void StuBasicInfoQueryForm_Load(object sender, EventArgs e) {

string sqlstr = \;

StuBasicInfoDS =

SqlHelper.ExecuteDataset(SqlHelper.ConnectionString,CommandType.Text,sqlstr);

//如果存在记录,显示第一条,否则提示没有数据信息 if (StuBasicInfoDS.Tables[0].Rows.Count == 0) {

MessageBox.Show(this, \不存在您要浏览的信息!!!\, \信息提示\, MessageBoxButtons.OK, MessageBoxIcon.Warning); }

else { currentRecord = 1;

CoverDataBind(currentRecord - 1);

}

C/S结构项目实训(C#语言版)

23

}

至此,窗体的初始化工作完毕。 ② “第一条”按钮功能的实现

在FirstRecorButton的Click事件中添加以下代码: if (StuBasicInfoDS.Tables[0].Rows.Count > 0)

{

currentRecord = 1;

CoverDataBind(currentRecord -1); PriorRecordButton.Enabled = false; NextRecordButton.Enabled = true;

}

③ “上一条”按钮功能的实现

在PriorRecordButton按钮的Click事件中添加以下代码: if (currentRecord > 1)

{

currentRecord = currentRecord - 1; CoverDataBind(currentRecord - 1); NextRecordButton.Enabled = true;

} else {

MessageBox.Show(this, \已经到达第一条!!!\, \信息提示\, MessageBoxButtons.OK, MessageBoxIcon.Warning); PriorRecordButton.Enabled = false;

}

④ “下一条”按钮功能的实现

在NextRecordButton按钮的Click事件中添加以下代码: if (currentRecord < StuBasicInfoDS.Tables[0].Rows.Count)

{

currentRecord = currentRecord + 1; CoverDataBind(currentRecord - 1);

C/S结构项目实训(C#语言版)

24

PriorRecordButton.Enabled = true;

} else {

MessageBox.Show(this,\已经到达最后一条!!!\,\信息提示\,MessageBoxButtons.OK,MessageBoxIcon.Warning); NextRecordButton.Enabled = false;

}

⑤ “最后一条”按钮功能的实现

在LastRecordButton按钮的Click事件中添加以下代码: if (StuBasicInfoDS.Tables[0].Rows.Count > 0)

{

currentRecord = StuBasicInfoDS.Tables[0].Rows.Count;

CoverDataBind(currentRecord - 1); PriorRecordButton.Enabled = true; NextRecordButton.Enabled = false;

}

至此,学生信息浏览的功能基本实现。

2.5 学生成绩信息查询窗体的设计与功能实现

(1)功能描述

该功能主要是根据输入的学号信息,查询学生的主要的基本信息(包括姓名、性别、出生日期等信息),然后用表格列出该学生所有选修课程的课程编号、课程名称、课程学分以及课程成绩等信息。

(2)流程图

针对功能描述,我们绘制学生成绩信息查询功能的操作流程图如图2.5-1说明。

C/S结构项目实训(C#语言版) 25

主菜单:数据查询 启动主窗体 子菜单:成绩信息查询 列示学生的成绩信息 成功 成绩查询窗体:输入学生学号 查询 数据验证 失败信息提示 图14.2.5-1:“学生成绩信息查询”功能流程图

(3)数据库设计

实现该功能计划采用带输出参数的存储过程来实现,否则我们需要进行两次数据库操作才能实现。为此,我们需要按照成绩信息查询操作的功能要求进行数据库设计。

首先,根据需要在stuInfoManage数据库中创建存储过程。该存储过程具有以下功能:可以根据输入参数学号,通过输出参数返回该学号所代表学生的姓名、性别和出生日期,同时通过存储过程返回该学生所修课程的成绩信息。

具体操作步骤如下:打开SQL Server 2000查询分析器输入以下代码并运行创建可以实现上所述功能的存储过程StuGradeQuery。

Use stuInfoManage

if exists (select * from sysobjects where name = StuGradeQuery and type = ‘P’)

drop procedure [dbo].[StuGradeQuery] GO

CREATE PROCEDURE StuGradeQuery (

26

C/S结构项目实训(C#语言版)

) as

@stuID varchar(12),

@stuName nvarchar(20) output, @stuSex nchar(1) output, @stuBirth varchar(12) output

select @stuName = stuName,@stuSex = stuSex,@stuBirth = convert(varchar(10),stuBirth,120) from stu where stuID=@stuID

select course.courseID as 课程编号,courseName as 课程名称,credit as 课程学分,grade as 成绩

from course inner join grade on course.courseID = grade.courseID where stuID = @stuID GO

至此,完成学生成绩查询所需的数据库设计任务完毕。 (4)界面设计

首先,在项目中添加一个Windows窗体类:StuGradeQueryForm,设置其Text属性为:学生成绩信息查询;然后在该窗体上添加以下控件并设置主要属性。具体控件及其主要属性设置参照表14.2.5-1说明。

控件类型 Label Label Label Label Label TextBox TextBox TextBox TextBox Button 控件名称 系统默认 系统默认 系统默认 系统默认 系统默认 StuIDInputTextBox StuNameTextBox StuSexTextBox StuBirthTextBox QueryButton 主要属性设置 Text:学生选修课程成绩查询 Text:查询学号输入: Text:姓名: Text:性别: Text:出生日期: 无 ReadOnly:true ReadOnly:true ReadOnly:true Text:查询 C/S结构项目实训(C#语言版) 27

DataGridView Panel GradeDataGridView 系统默认 无 无 表2.5-1:“学生成绩信息查询”窗体控件及其主要属性设置说明

此外为了美观效果,我们适当调整窗体和控件的其他属性(字体和颜色等)。具体的设计效果可以参照图2.5-2。

图14.2.5-2:“学生成绩查询”窗体设计效果图

(5)代码实现

5.1 菜单功能调用的实现

首先,在MainForm窗体类中添加StuGradeQueryForm窗体类的一个实例。 StuGradeQueryForm StuGradeInfoQueryForm = new StuGradeQueryForm(); 其次,在系统主菜单“数据查询”的“学生成绩信息查询”功能选项的Click事件中添加“学生成绩查询”窗体的功能调用代码。

if (StuGradeInfoQueryForm.IsDisposed) {

StuGradeInfoQueryForm = new StuGradeQueryForm();

C/S结构项目实训(C#语言版)

28

}

StuGradeInfoQueryForm.MdiParent = this; StuGradeInfoQueryForm.Show();

StuGradeInfoQueryForm.Focus(); 5.2 窗体功能的实现 ① 窗体状态的初始化

我们在窗体启动或查询失败时,需要清空界面所有控件的已有数据,故我们进行以下操作来实现该功能。

首先,在StuGradeQueryForm窗体类中添加以下私有方法设置控件属性。 private void CoverComponentReset() {

StuIDInputTextBox.Clear(); StuNameTextBox.Clear(); StuSexTextBox.Clear(); StuBirthTextBox.Clear();

GradeDataGridView.DataSource = \; StuIDInputTextBox.Focus(); }

其次,在StuGradeQueryForm窗体类的Load事件中调用CoverComponentReset方法对窗体控件进行初始化操作。

private void StuGradeQueryForm_Load(object sender, EventArgs e) {

CoverComponentReset();

}

② “查询”按钮功能的实现

在查询按钮中,我们需要根据数据库操作的结果进行操作选择:如果存在学号所代表的学生基本信息以及相关成绩信息,则直接列示;如果不存在,则提示相关信息并清除窗体界面的已有数据。实现该功能,我们需要在查询按钮的Click事件中添加以下代码:

private void QueryButton_Click(object sender, EventArgs e)

{

C/S结构项目实训(C#语言版)

29

string StuID = StuIDInputTextBox.Text.Trim(); SqlParameter[] cmdParam = new SqlParameter[]{

new SqlParameter(\,StuID),

new SqlParameter(\,SqlDbType.NVarChar,20), new SqlParameter(\,SqlDbType.NChar,1), new SqlParameter(\,SqlDbType.VarChar,12) };

cmdParam[1].Direction = ParameterDirection.Output; cmdParam[2].Direction = ParameterDirection.Output; cmdParam[3].Direction = ParameterDirection.Output; DataSet stuGradeDS =SqlHelper.ExecuteDataset(

SqlHelper.ConnectionString,CommandType.StoredProcedure,\y\,cmdParam);

if (!cmdParam[1].Value.ToString().Equals(\)) {

StuNameTextBox.Text = cmdParam[1].Value.ToString(); StuSexTextBox.Text = cmdParam[2].Value.ToString(); StuBirthTextBox.Text = cmdParam[3].Value.ToString();

GradeDataGridView.DataSource = stuGradeDS.Tables[0].DefaultView; GradeDataGridView.Columns[0].DataPropertyName = stuGradeDS.Tables[0].Columns[0].ToString(); GradeDataGridView.Columns[1].DataPropertyName = stuGradeDS.Tables[0].Columns[1].ToString(); GradeDataGridView.Columns[2].DataPropertyName = stuGradeDS.Tables[0].Columns[2].ToString(); GradeDataGridView.Columns[3].DataPropertyName = stuGradeDS.Tables[0].Columns[3].ToString(); } else

C/S结构项目实训(C#语言版)

30

本文来源:https://www.bwwdw.com/article/w4x3.html

Top