C#开发案例在线考试系统及GridView控件使用Word格式文档下载.docx
《C#开发案例在线考试系统及GridView控件使用Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C#开发案例在线考试系统及GridView控件使用Word格式文档下载.docx(26页珍藏版)》请在冰豆网上搜索。
![C#开发案例在线考试系统及GridView控件使用Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2023-1/22/446ed5a1-a4ca-4e8f-a496-d1bfac0d62e9/446ed5a1-a4ca-4e8f-a496-d1bfac0d62e91.gif)
●教师权限
教师登录后,可对试题基本信息进行添加、修改、查询及删除操作。
同时对学生考试成绩进行查询及删除操作。
如果教师对现有的密码不满意,还以修改自己的密码,如图1.9所示。
图1.9教师权限
11.3.4业务流程图488
在线考试系统业务流程图如下:
11.3.5程序运行环境489
本系统对其运行环境有一定的要求,具体如下:
●系统开发平台:
MicrosoftVisualStudio2008
●系统开发语言:
C#
●数据库管理系统软件:
MicrosoftSQLServer2005
●运行平台:
WindowsXP(SP2)以及以上版本
●运行环境:
Microsoft.NETFrameworkSDKv3.5
●分辨率:
最佳效果1024*768像素
11.3.6数据库设计489
dbo.tb_Admin
存储管理员信息
dbo.tb_Lesson
存储课程信息
dbo.tb_score
存储考试成绩信息
dbo.tb_Student
存储学生信息
dbo.tb_Teacher
存储教师信息
dbo.tb_Test
存储试题信息
11.3.7数据库概念设计489
即描绘各个数据表的实体E-T图
11.3.8数据库逻辑结构设计490
11.3.9文件夹组织结构492
每个网站都会有相应的文件夹组织结构,如网站中网页数目很多,可以将所有的网页及资源放在不同的文件夹中。
如果网站中网页不是很多,可以将图片、公共类或者程序资源文件放在相应的文件夹中,而网页可以直接放在网站根目录下。
本系统是按照前者组织文件夹结构排列的。
11.4公共类设计493
11.5登录模块设计495
11.5.1登录模块概述495
不是所有人都可以参加在线考试系统,系统默认是不允许匿名登录的,只有使用管理员分配的账号和密码才能登录。
11.5.2登录模块技术分析495
登录模块中,使用了验证码技术来防止用机器人软件反复自动登录。
该技术是通过Random类实现的。
Random类:
表示伪随机生成器,一种能够产生满足某些随机性统计要求的数字序列的设备,该类中最常用的是Random.Next方法。
Random.Next方法用于返回一个指定范围内的随机数。
语法如下:
publicvirtualintNext(intminValue,intmaxValue)
参数说明:
minValue:
返回随机数下界。
maxValue:
返回随机数上界。
返回值:
一个大于或等于minValue且小于maxValue的32位带符号整数。
11.5.3登录模块实现过程496
11.6随机抽取试题模块设计497
11.6.1随机抽取试题模块概述497
11.6.2随机抽取试题模块技术分析498
11.6.3随机抽取试题模块实现过程499
11.6.4单元测试502
11.7自动评分模块设计503
11.7.1自动评分模块概述503
11.7.2自动评分模块技术分析503
11.7.3自动评分模块实现过程504
11.8试题管理模块设计505
11.8.1试题管理模块概述505
11.8.2试题管理模块技术分析505
11.8.3试题管理模块实现过程507
11.8.4单元测试512
11.9后台管理员模块设计513
11.9.1后台管理员模块概述513
11.9.2后台管理员模块技术分析514
11.9.3后台管理员模块实现过程514
11.10开发技巧与难点分析526
开发在线考试系统的随机抽取试题模块时,为了防止考生刷新考试页面后产生错误的考试结果,使用JavaScript脚本限制了鼠标右键、F5刷新键及BackSpace键,从而达到防止刷新的目的,使得考试页面更加安全、合理。
关键代码如下:
在<
body>
区域添加如下代码,当按某个键时激发keydown函数,并且屏蔽右键和选择功能。
<
bodyonkeydown="
keydown()"
oncontextmenu="
returnfalse"
onselectstart="
>
在线考试系统通过JavaScript脚本实现考试计时功能,规定考试在指定时间内交卷;
否则,达到限定时间后,系统会强行提交试卷,并对其进行评分。
11.11GridView控件应用527
具体代码在ExamOnLine/teacher/TExaminationResult.aspx中。
GridView控件是ASP.NET的DataGrid控件的后继者。
它是一个功能非常强大的通用控件,可以处理简单而常见的操作,如分页、排序、编辑或删除数据等。
以尽可能少的数据实现双向数据绑定,该控件与新的数据源控件系列紧密结合,而且只要底层的数据源对象支持,它还可以直接处理数据源更新。
它能定义多个主键字段、新的列类型以及样式和模板选项。
GridView支持大量属性,有如下几大类:
行为、可视化设置、样式、状态和模板。
GridView的常用行为属性:
属性
说明
AllowPaging
指示该控件是否支持分页;
AllowSorting
指示该控件是否支持排序;
AutoGenerateColumns
指示是否自动地为数据源中的每个字段创建列,默认为True;
AutoGenerateDeleteButton
指示该控件是否包含一个按钮列以允许用户删除映射到被单击行的记录;
AutoGenerateEditButton
指示该控件是否包含一个按钮列以允许用户编辑映射到被单击行的记录;
AutoGenerateSelectButton
指示该控件是否包含一个按钮列以允许用户选择映射到被单击行的记录;
DeataMember
指示一个多成员数据中的特定表绑定到该网格。
该属性与DataSource结合使用。
如果DataSource是有一个DataSet对象,则该属性包含要绑定的特定表的名称
DataSource
获得或设置包含用来填充该控件的值的数据源对象;
DataSourceID
指示所绑定的数据源控件
EnableSortingAndPagingCallbacks
指示是否使用脚本回调函数完成排序和分页。
默认情况下禁用;
RowHeaderColumn
用作列标题的列名,该属性旨在改善可访问性;
SortExpression
获得当前排序表达式;
UseAccessibleHeader
规定是否为列标题生成<
th>
标签(而不能<
td>
标签)。
GridView控件的模板属性:
EmptyDataTemplate
指示该控件绑定到一个空的数据源时要生成的模板内容。
如果该属性和EmptyDataText属性都设置了,则该属性优先采用。
如果两个属性都没有设置,则把该网格控件绑定到一个空的数据源时不生成该网格;
PagerTemplate
指示要为分页器生成的模板内容。
该属性覆盖我们可能通过PagerSettings属性作出的任何设置。
GridView控件的状态属性:
BottomPagerRow
返回表示该网格控件的底部分页器的GridViewRow对象;
Columns
获得一个表示该网格中的列的对象的集合。
如果这些列是自动生成的,则该集合总是空的;
DataKeyNames?
获得一个包含当前显示项的主键字段的名称的数组;
DataKey
获得一个表示在DataKeyNames中为当前显示的记录设置的主键字段的值;
EditIndex
获得和设置基于0的索引,标识当前以编辑模式生成的行;
FooterRow
返回一个表示页脚的GridViewRow对象;
HeaderRow
返回一个表示标题的GridViewRow对象;
PageCount
获得显示数据源的记录所需的页面数;
PageIndex
获得或设置基于0的索引,标识当前显示的数据页;
PageSize
指示在一个页面上要显示的记录数;
Rows
获得一个表示该控件中当前显示的数据行的GridViewRow对象集合;
SelectedDataKey
返回当前选中的记录的DataKey对象;
SelectedIndex
获得和设置标识当前选中行的基于0的索引;
SelectedRow
返回一个表示当前选中行的GridViewRow对象;
SelectedValue
返回DataKey对象中存储的键的显式值。
类似于SelectedDataKey;
TopPagerRow
返回一个表示网格的顶部分页器的GridViewRow对象。
GridView控件激发的事件:
PageIndexChanging/ed
这两个事件都是在其中一个分页器按钮被单击时发生。
它们分别在网格控件处理分页操作之前和之后激发;
RowCancelingEdit
在一个处于编辑模式的行的Cancel按钮被单击,但是在该行退出编辑模式之前发生;
RowCommand
单击一个按钮时发生;
RowCreated
创建一行时发生;
RowDataBound
一个数据行绑定到数据时发生;
RowDeleting,RowDeleted
这两个事件都是在一行的Delete按钮被单击时发生。
它们分别在该网格控件删除该行之前和之后激发;
RowEditing
当一行的Edit按钮被单击时,但是在该控件进入编辑模式之前发生;
RowUpdating,RowUpdated
这两个事件都是在一行的Update按钮被单击时发生。
它们分别在该网格控件更新该行之前和之后激发;
SelectedIndexChanging/ed
这两个事件都是在一行的Select按钮被单击时发生。
它们分别在该网格控件处理选择操作之前和之后激发;
Sorting,Sorted
这两个事件都是在对一个列进行排序的超链接被单击时发生,它们分别在网格控件处理排序操作之前和之后激发。
GridView绑定
对列进行配置:
如下代码把一个数据绑定的列添加到网格中:
asp:
GridViewID="
GridView1"
runat="
server"
DataSourceID="
SqlDataSource1"
>
Columns>
BoundFieldDataField="
companyname"
HeaderText="
产品名称"
/>
/Columns>
EmptyDataTemplate>
/EmptyDataTemplate>
/asp:
GridView>
GridView中的绑定列,这些列字段类都继承DataControlField:
BoundField
默认的列类型。
作为纯文本显示一个字段的值;
ButtonField
作为命令显示一个字段的值。
我们可以选择链接按钮或按钮开关样式;
CheckBoxField
作为一个复选框显示一个字段的值,它通常用来生成布尔值;
CommandField
是ButtonField的增强版本,表示一个特殊的命令,诸如Select、Delete、Insert或Update,该属性对GridView控件几乎没什么用;
该字段是为DetailsView控件定制的;
HyperLinkField
作为超链接显示一个字段的值。
单击该超链接时,浏览器导航到指定的URL;
ImageField
作为一个<
img>
HTML标签的Src属性显示一个字段的值,绑定字段的内容应该是物理图像的URL;
TemplateField
为列中的每一项显示用户定义的内容
GridView列的公共属性,代表每个列类型实际提供的属性的一个子集;
AccessibleHeaderText
表示AssistiveTechnology设备的屏幕阅读器读取的缩写文本的文本;
FooterStyle
获得该列的页脚的样式对象;
FooterText
获得和设置该列的页脚的文本;
HeaderImageUrl
获得和设置放在该列的标题中的图像的URL;
HeaderStyle
获得该列的标题的样式对象;
HeaderText
获得和设置该列的标题的文本;
InsertVisible
指示当它的父数据绑定控件处于插入模式时,该字段是否可见;
ItemStyle
获得各列的单元的样式对象;
ShowHeader
指示是否生成该列的标题;
获得和设置该列的标题被单击时用来排序网格的表达式;
绑定字段
BoundField类表示在一个数据绑定控件(诸如GridView或DetailsView)中作为纯文本显示的一个字段。
为了规定要显示的字段,把DataField属性设置为该字段的名称,要在头部或页脚部分显示一个标题,请分别设置HeaderText和FooterText属性;
按钮字段
按钮字段表示我们希望通过一个服务器端事件处理的任何操作,当该按钮被单击时,页面回发并激发一个RowCommand事件。
超链接字段
超链接列把用户指向一个不同的URL,该URL可以有选择地在一个内部框架中显示出来。
如:
HyperLinkFieldID="
HyperLinkField1"
DataNavigateUrlFields="
id"
DataNavigateUrlFormatString="
Flower.aspx?
id={0}"
DataTextField="
name"
鲜花"
当用户单击该按钮时,浏览器用Flower.aspx?
id=XXX将鲜花id传出
CheckBox字段
CheckBoxField列是显示一个复选框的一个较简单的绑定列.
图像字段
ImageField列类型表示一个在数据绑定控件中作为图像显示的字段。
模板字段
有时候我们需要一些特殊格式的绑定字段,是定制列。
这可以通过使用模板得到的结果。
TemplateField列为该网格中的每一行提供一个个性化用户界面,这完全是由页面开发人员定义的,我们可以为名生成阶段定义模板,包括默认视图、原地编辑、标题和页脚。
GridView控件支持的模板
AlternatingItemTemplate
定义交替行的内容和外观,如果没有规定模板,则使用ItemTemplate;
EditItemTemplate
定义当前正在编辑的行的内容和外观。
该模板包含输入字段,而且还可能包含验证程序;
FooterTemplate
定义该行的页脚的内容和外观;
HeaderTemplate
定义该行的标题的内容和外观;
ItemTemplate
定义该行的默认内容和外观。
一个模板化视图可以包含对我们正在创建的应用程序有意义的东西:
服务器控件、文字和数据绑定表达式。
数据绑定表达式允许我们插入当前数据行中包含的值,然而,并非所有的模板都支持数据绑定表达式。
如下代码说明了如何为一个产品定义项目模板。
该列显示在现行上,并包括产品的名称和一些有关产品包装的信息。
TemplateField>
ItemTemplate>
%#Eval("
productName"
)%>
br/>
availablein<
quantityperunit"
/ItemTemplate>
数据绑定语法
ASP.NET中,有如下两种数据绑定语法:
1、使用Eval方法
可计算数据绑定控件的模板中后期绑定数据表达式。
Eval方法以数据字段的名称作为参数
Eval方法可诸数据绑定控件的模板中的后期绑定数据表达式。
在运行时,Eval方法调用DataBinder对象的Eval方法,同时引用命名容器的当前数据项。
命名容器通常是包含完整记录的数据绑定控件的最小组成部分,如GridView控件中的一行。
Eval方法以数据字段的名称作为参数,从事数据源的当前记录返回一个包含该字段值的字符串。
字符串格式参数使用String类的Format方法定义的语法。
Eval是只读的方法论(定向数据绑定),绑定的内容为不会提交回服务器。
比如用户名,并不想让用户做任何修改,可以使用:
UserName"
).ToString.Trim()%>
Eval还有一个重载的方法,可以实现格式化。
比如需要用户的注册时间,可以使用:
RegTime"
"
{0:
dd/MM/yyyy}"
其中0代表对应的PublishDate字段,而dd/MM/yyyy指明了最终显示文本的格式,它可能会显示为17/07/2009.
2、使用Bind方法
Bind方法与Eval方法有一些相似之处,但也存在很大的差异。
虽然可以像使用Eval方法一样使用Bind方法来检索数据绑定字段的值,但当数据可以被修改是地,还是要使用Bind方法。
Bind方法通常与输入控件一起使用,例如由编辑模式中的GridView行所呈现的TextBox控件。
当数据绑定控件将这些输入控件作为自身呈现的一部分创建时,该方法便可提取输入值。
Bind方法支持读/写功能(双向数据绑定),该方法常常与输入控件(比如TextBox控件)一起使用,达到可更新数据的目的。
比如图书的标题可以修改,可以设置为:
%#Bind("
Title"
GridView深入
1、高亮显示
当我们的鼠标移动到GridView的某一行时,该行加亮显示,
代码如下:
protectedvoidGridView1_RowDataBound(objectsender,GridViewRowEventArgse)//判断是否为数据行,即排除表头和尾
{
if(e.Row.RowType==DataControlRowType.DataRow)
e.Row.Attributes.Add("
onmouseover"
"
currentcolor=this.style.backgroundColor;
this.style.backgroundColor='
yellow'
this.style.fontWeight='
bold'
"
);
onmouseout"
this.style.backgroundColor=currentcolor,this.style.fontWeight='
'
}
如果需要高亮显示的不是整行,而是某个单元格,也可以使用该方法,比如我们要高亮显示价格是"
199.00"
的单元格,
代码为:
if(((flower.Models.Product)e.Row.DataItem).Price.Trim()=="
)
{
e.Row.Cells[3].BackColor=System.Drawing.Color.Yellow;
2、删除提示
我们在做删除操作的时候,都会需要一个提示,当用户确认后才进行删除操作,对于这种情况,我们一般采用模板列进行处理。
LinkButtonID="
LinkButton1"
OnClientClick="
javascript:
returnconfirm('
记录一旦删除不可恢复,确认要删除吗?
)"
CausesValidation="
false"
CommandName="
Delete"
Text="
删除"
LinkButton>
3、GridView结合复选框的全选效果
有时候,我们需要删除多条记录,为方便用户使用,我们不希望每条记录删除一次,而希望有一个复选框,可以一次删除多条记录,而不是一次次的点删除确认。
这时,可以使用复选框来实现多选的效果。
首先,创建模板列,并在其中放置CheckBox控件,编写客户端脚本,代码如下:
scriptlanguage="
javascript"
functionGetAllCheckBox(CheckAll)
varitems=document.getElementsByTagName("
input"