86
http://www.wenyuan.com.cn/webnew/ 9 9 ASP.NET ASP.NET 第第第第 第第第第 第第第第第第 第第第第第第第 第第第第第第第第第第第 一统 ASP.NET 第第第第第 第第第第第 第第 第 统一 ASP.NET 第 ADONET 第第第第 第第第第 一, 第第第第第第第第第第第第第 第第第第第 第第第第第第第第第第 。一。

第 9 章 ASP.NET 编程实例

Embed Size (px)

DESCRIPTION

第 9 章 ASP.NET 编程实例. 本章力图通过一个网上考试系统实例来讲解如何综合运用 ASP.NET 解决实际问题。 网上考试系统是一个 ASP.NET 和 ADONET 相结合的一个实例,用于完成网上考试的整个流程。即从组卷一直到判卷的整个过程。. 9.1 实例分析与设计. 网上考试系统主要包括注册、登陆、用户管理、组卷、在线考试、成绩查询、试题库管理等功能。 1. 注册的主要功能 *显示注册页面 *用户在线注册 2. 登陆的主要功能 *显示登陆页面 *进行用户验证 - PowerPoint PPT Presentation

Citation preview

Page 1: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

第第 99 章 章 ASP.NETASP.NET 编程实例编程实例 本章力图通过一个网上考试系统实例来讲解如何综合运用 ASP.NET 解决实际问题。 网上考试系统是一个 ASP.NET 和 ADONET 相结合的一个实例,用于完成网上考试的整个流程。即从组卷一直到判卷的整个过程。

Page 2: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

9.1 9.1 实例分析与设计实例分析与设计 网上考试系统主要包括注册、登陆、用户管理、组卷、在线考试、成绩查询、试题库管理等功能。1. 注册的主要功能 * 显示注册页面 * 用户在线注册2. 登陆的主要功能 * 显示登陆页面 * 进行用户验证 * 根据用户权限进入相应模块3. 用户管理的主要功能 * 用户信息录入 * 用户信息修改 * 用户信息删除 * 用户信息查询

Page 3: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

4. 组卷的主要功能 * 确定试卷名称 * 确定试卷考试题类型 * 确定试卷考题数目 * 确定试卷考题分数5. 在线考试的主要功能 * 根据组卷情况从试题库中随机抽取试题 * 给用户的试卷评分 * 保存用户考试成绩6. 成绩查询的主要功能 * 查询当前用户的考试成绩7. 试题库管理的主要功能 * 添加试题 * 修改试题 * 删除试题 * 查询试题

Page 4: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

9.2 9.2 数据库分析与设计数据库分析与设计 根据系统功能,为网上考试系统设计了四个数据表:试题数据表、试卷数据表、用户数据表、考试分数数据表。9.2.1 创建数据库 网上考试系统采用 Microsoft Access 2000 数据库,因此应确保在您的机器上安装有 Access2000 数据库。下面是创建数据库的具体步骤: 1. 从开始菜单运行 Access2000 。 2. 出现如图 9-1 所示的“ Microsoft Access” 对话框,选择“ Access 数据库向导、数据页和项目”,单击“确定”按钮。

Page 5: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/图 9-1 Microsoft Access 对话框

Page 6: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

3. 出现如图 9-2 所示“新建”对话框,选择“常用”选项卡,“数据库”项,单击“确定”按钮。

图 9-2 新建对话框

Page 7: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

4. 出现如图 9-3 所示的“文件新建数据库”对话框。在“文件名”文本框中输入数据库的名字 Exam ,并选择数据库文件存放位置,这里选择与网页文件存放在同一个文件夹下。单击“创建”按钮,一个空数据库就生成了。

图 9-3 文件新建数据库对话框

Page 8: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

9.2.2 创建数据表 下面以创建“ user1 (用户)”数据表为例,演示创建数据表的步骤。User1 数据表的基本结构如表 9-1 所示: 表 9-1 User1 (用户)表字段名称 数据类型 字段大小 必填字段 说明UserID 自动编号 长整型 是 用户号UserName 文本 20 是 用户姓名Pwd 文本 10 是 密码Power 文本 10 是 权限Demo 文本 50 否 备注创建数据表的步骤:

1. 双击刚创建的数据库文件 Exam.mdb ,打开 Exam 数据库。2. 出现如图 9-4 所示的“ Exam :数据库”对话框,选择左侧“对象”选项,并选择“表”项。双击右侧的“使用设计器创建表”。

Page 9: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/图 9-4 Exam :数据库对话框

Page 10: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

3. 出现如图 9-5 所示的“表”对话框,在“字段名称”栏中输入“ UserID” 字段名;在“数据类型”栏中选择“自动编号”;在“表”对话框的下部“常规”选项卡的“字段大小”栏中,选择“长整型”;在“新值”栏中,选择“递增”。至此就创建该数据表的“ UserID”字段。依照以上步骤,分别创建“ UserName” 字段、“ Pwd” 字段、“ Demo” 字段。在“ UserID” 字段上右键单击,从弹出的快捷菜单中,选择“主键”,把“ UserID” 字段设为该表的主键。设计后的结果如图 9-6 所示。单击工具栏上的“保存”按钮,保存表,并且为表起一个名字“ User1” 。

Page 11: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/图 9-5 表对话框

Page 12: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/图 9-6 最终结果

Page 13: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

依照以上步骤分别创建试题数据表、试卷数据表、考试分数数据表。 试题数据表的结构如表 9-2 所示,试卷数据表的结构如表 9-3 所示,考试分数表的结构如表 9-4 所示。 表 9-2 Subject (试题)表字段名称 数据类型 字段大小 必填字段 说明SubjectID 自动编号 长整型 是 试题号Type 文本 20 是 试题类型Question 文本 50 是 试题内容Option1 文本 50 否 试题选项 1Option2 文本 50 否 试题选项 2Option3 文本 50 否 试题选项 3Option4 文本 50 否 试题选项 4Option5 文本 50 否 试题选项 5Option6 文本 50 否 试题选项 6Answer 文本 50 是 试题答案

Page 14: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

表 9-3 Paper (试卷)表字段名称 数据类型 字段大小 必填字段 说明ExamID 自动编号 长整型 是 试卷号ExamName 文本 20 是 试卷名Type1 文本 20 否 试题类型 1Number1 数字 整型 否 试题数 1Score1 数字 单精度型 否 分数 1Type1 文本 20 否 试题类型 2Number1 数字 整型 否 试题数 2Score1 数字 单精度型 否 分数 2Type1 文本 20 否 试题类型 3Number1 数字 整型 否 试题数 3Score1 数字 单精度型 否 分数 3ExamDate 日期 /时间 否 组卷时间

Page 15: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

表 9-4 Score (分数)表字段名称 数据类型 字段大小 必填字段 说明UserID 数字 长整型 是 用户号ExamID 数字 长整型 是 试卷号Score 数字 单精度型 是 分数

9.2.3 创建查询 为“查询成绩”建立一个查询 SubjectScore ,以下是创建的步骤:1. 双击数据库文件 Exam.mdb,打开 Exam 数据库。2. 出现如图 9-4 所示的“ Exam :数据库”对话框,选择左侧“对象” 选项,并选择“查询”项。双击右侧的“在设计器视图中创建查询”。

Page 16: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

3. 在出现的“显示表”对话框中,选中 Paper 、 Score 和 User1 数据表,单击“添加”按钮。单击“关闭”按钮。4. 出现如图 9-7 所示的“选择查询”对话框。在对话框的上部,用鼠标右键单击,在出现的快捷菜单中,选择“ SQL设计视图”。5. 在出现的“选择查询”对话框中,输入 SELECT Paper.ExamName AS 考试名称 , User1.UserName AS 用户名 , Score.Score AS 考试分数 FROM (Paper INNER JOIN Score ON Paper.ExamID = Score.ExamID) INNER JOIN User1 ON Score.UserID = User1.UserID;6. 单击工具栏上的“保存”按钮,给查询起一个名字 SubjectScore 。

Page 17: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/图 9-7 选择查询对话框

Page 18: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

9.3 9.3 主页面主页面 主页面主要完成的功能是:让用户选择是进入登陆页面,还是进入注册页面。9.3.1 主页面设计 主页面上使用的控件如表 9-5 所示,运行后的效果如图 9-8所示。 表 9-5 控件及属性控件类型 控件名 属性 含义Button Register Text 为“新用户注册” 进入用户注册页面Button Login Text 为“登录” 进入登陆页面

Page 19: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/图 9-8 主页面

Page 20: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

9.3.2 主页面实现主页面只使用一个文件 main.aspx来实现,具体代码如下:

<%@ Page Language="VB" Debug="true" %><Html><Head><Title>网上考试系统 </Title><Script Language="VB" runat="Server">Sub OnRegister_Click(byval Sender As object,e As Eventargs)

Response.Redirect("register.aspx")End SubSub OnLogin_Click(byval Sender As object,e As Eventargs)

Server.Transfer("default.aspx")End Sub</Script></Head><Body><Form runat="server">

Page 21: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

<P><P><CENTER><FONT Size=6 COLOR="Blue"> 欢迎使用网上考试系统 </FONT><HR><P align="center"><P><P> <asp:Button id="Register" Text="新用户注册 "OnClick="OnRegister_Click" runat="server" /> <asp:Button id="Login" Text="登 陆 " OnClick="OnLogin_Click" runat="server" /> </Form></Body></Html> 页面中的 Register 按钮控件定义了一个按钮单击事件,用于跳转到“注册”页面。在该事件响应程序 OnRegister_Click中,使用 Response 对象的 Redirect方法,即: Response.Redirect("register.aspx") 跳转到注册页面。

Page 22: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

为 Longin按钮控件定义了一个按钮单击事件,用于跳转到“登陆”页面。在该事件响应程序 OnLogin_Click中,使用了 Server 对象的 Transfer方法,即: Server.Transfer("default.aspx")

跳转到登陆页面。虽然在这两个事件中使用了不同方法,但执行的效果是一样的。 9.4 用户注册 “ 用户注册”主要完成的功能是:实现用户在线注册功能。9.4.1 注册页面设计 注册页面上使用的控件如表 9-6 所示,运行后的效果如图 9-9 所示。

Page 23: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

控件类型 控件名 属性 含义Label Message ForeColor 设为 Red 为用户显示反馈信息TextBox Name Size 设为 14 接收用户输入的用户名TextBox Pwd Size 设为 16

TextMode 设为 Password接收用户输入的密码

TextBox RePwd Size 设为 16TextMode 设为 Password

接收用户输入的确认密码RequiredFieldValidator NameValid ControlToValidate 设为 Name 保证文本框 Name 必须输入值RequiredFieldValidator PwdValid ControlToValidate 设为 Pwd 保证文本框 Pwd 必须输入值RequiredFieldValidator RePwdValid ControlToValidate 设为 RePwd 保证文本框 RePwd 必须输入值CompareValidator ComparePwd ControlToValidate 设为 RePwd ControlToCompare 设为Pwd ErrorMessage 设为“注册失败!

密码输入有误。 "

用于比较 Pwd 和 RePwd 输入的内容

Button Entry Text 为“注册” 提交注册信息Hyperlink Return Text 为“返回”

NavigateUrl为 main.aspx返回到主页面

表 9-6 控件及属性

Page 24: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/图 9-9 用户注册页面

Page 25: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

注册不成功页面如图 9-10 和图 9-11 所示。

图 9-10 注册不成功页面

Page 26: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/图 9-11 注册不成功页面

Page 27: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

注册成功页面上使用的控件如表 9-7 所示,运行后的效果如图 9-12 所示。 表 9-7 控件及属性控件类型 控件名 属性 含义Button Login Text 为“登陆” 跳转到登陆页面Button Return Text 为“返回” 返回到主页面

Page 28: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/图 9-12 注册成功页面

Page 29: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

9.4.2 注册页面实现 注册页面只使用一个文件 register.aspx来实现。1. 注册 注册功能主要在“注册”按钮的事件响应函数 Button_Click中实现,该函数的具体代码如下:Sub Button_Click(Sender As Object, e As EventArgs)Dim com as OleDbCommand ComStr = "Select UserName From user1 Where UserName='" & Trim(Name.Text) & "'"Com = New OleDbCommand(ComStr,conn)Dim rd as OledbDataReaderrd = Com.ExecuteReader()'判断该用户名是否存在if rd.Read() thenrd.closeMessage.Text="注册失败!此用户名已经有人使用 "Message.Text= Message.Text & ",请选择另一个用户名重新注册。 "exit sub

Page 30: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

else '在 User1 数据表中记录用户信息ComStr="insert into user1(UserName,Pwd) values('" & Name.Text ComStr= ComStr & "','" & Pwd.Text & "')"Com = New OleDbCommand(ComStr,conn)rd.closeCom.ExecuteNonQuery()conn.closeResponse.Redirect("regSuccess.aspx")end if End Sub 在函数中,首先根据用户提供的用户名,在用户数据表 user1 中查询表中该用户名是否存在。如果存在,提示用户“注册失败!此用户名已经有人使用,请选择另一个用户名重新注册。”。如果不存在,则在用户数据表 User1 中记录该用户信息,并跳转到用户注册成功页面。

Page 31: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

2. 用户名和密码验证 在注册页面中,“用户名”、“密码”和“确认密码”是必录项。这一功能是通过验证控件 RequiredFieldValidator 来实现的。 “ 密码”和“确认密码”要求一致,这一功能是通过验证控件 CompareValidator 实现的。3.返回 在注册页面中,没有使用按钮来完成“返回”功能,主要是因为验证控件会发生作用,要求输入“用户名”和“密码”,从而使按钮不能完成“返回”功能。为了解决这一个问题,采用 Hyperlink 控件,因为他不会向服务器提交表单内容,所以不会触发验证控件的验证功能。如果想使用按钮来完成“返回”功能,必须停用该按钮的验证功能(详见 7.1.3 )。4.全部代码<%@ Import Namespace="system.Data" %><%@ Import Namespace="system.Data.Oledb" %><%@ Page Language="VB" Debug="true" %><HTML><HEAD><TITLE>网上考试系统 </TITLE>

Page 32: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

<Script Language="VB" runat="server">Dim conn as OleDbConnectionDim conStr,comStr as String Sub Page_Load(Sender As object,e As Eventargs) conStr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="conStr=conStr & server.mappath("EXAM.MDB")conn = New OleDbConnection(conStr)Conn.Open() End Sub Sub Button_Click(Sender As Object, e As EventArgs)Dim com as OleDbCommand ComStr = "Select UserName From user1 Where UserName='" ComStr = ComStr & Trim(Name.Text) & "'"Com = New OleDbCommand(ComStr,conn)Dim rd as OledbDataReaderrd = Com.ExecuteReader()if rd.Read() thenrd.closeMessage.Text="注册失败!此用户名已经有人使用 "Message.Text= Message.Text & ",请选择另一个用户名重新注册。 "exit sub

Page 33: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

else ComStr="insert into user1(UserName,Pwd) values('" ComStr=Comstr & Name.Text & "','" & Pwd.Text & "')"Com = New OleDbCommand(ComStr,conn)rd.closeCom.ExecuteNonQuery()conn.closeResponse.Redirect("regSuccess.aspx")end if End Sub</script></HEAD><BODY><FORM runat="Server"><p><p><CENTER><FONT size=6 COLOR="Blue">网上考试系统 </FONT><HR><P align="center"><asp:Label id="Message" Forecolor="Red" runat="server"/><P>

Page 34: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

用户名: <asp:TextBox id="Name" runat="server" size="14"/><asp:RequiredFieldValidator id="NameValid" ControlToValidate="Name" runat="server">( 请输入用户名! )</asp:RequiredFieldValidator><p>密码:<asp:TextBox id="Pwd" TextMode="Password" runat="server" size="16"/><asp:RequiredFieldValidator id="PwdValid" ControlToValidate="Pwd" runat="server">( 请输入密码! )</asp:RequiredFieldValidator><p>确认密码:<asp:TextBox id="RePwd" TextMode="Password" runat="server" size="16"/><asp:RequiredFieldValidator id="RePwdValid"ControlToValidate="RePwd" runat="server">( 请输入确认密码! )</asp:RequiredFieldValidator><p><asp:comparevalidator id="comparePwd"controltovalidate="RePwd" controltocompare="Pwd"errormessage="注册失败!密码输入有误。

Page 35: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

runat="server"/><P><asp:Button id="Entry" Text="注 册 " Runat="server" OnClick="Button_Click"/><asp:Hyperlink id="Return" Text=" 返 回 " Runat="server" NavigateUrl="main.aspx"/></FORM></CENTER></BODY></HTML> 9.5 登陆 “ 登陆”主要完成的功能是:用户身份确认。它决定用户是否有权限使用系统,如果有权限,则根据用户的权限跳转到相应的页面,完成相应的任务。9.5.1 登陆页面设计 登陆页面上使用的控件如表 9-8所示,运行后的效果如图9-13 所示。

Page 36: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

表 9-8 控件及属性控件类型 控件名 属性 含义Label Bulletin ForeColor 设为 Blue 显示“用户登陆”字样Label Label1 为用户显示反馈信息TextBox Name Size 设为 14 接收用户输入的用户名TextBox Pwd Size 设为 16TextMode 设为Password 保证文本框 Name 必须输入值RequiredFieldValidator NameValid ControlToValidate 设为 Name 保证文本框 Name 必须输入值RequiredFieldValidator PwdValid ControlToValidate 设为 Pwd 保证文本框 Pwd 必须输入值Button Login Text 为“登录” 进入登陆页面Hyperlink Return Text 为“返回” NavigateUrl为 main.aspx 返回到主页面

Page 37: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/图 9-13 登陆页面

Page 38: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

9.5.2 登陆页面实现 登陆页面只使用一个文件 default.aspx来实现。1. 用户验证和权限判断 使用“登陆”按钮的事件响应函数 OnLogin_Click来实现,该函数的具体代码如下:Sub OnLogin_Click(Sender As Object, e As EventArgs)

Dim com as OleDbCommand ComStr = "Select Power,UserID From user1 Where UserName='"ComStr=ComStr & Trim(Name.Text) & "' And Pwd='" & Trim(Pwd.Text) & "'"

Com = New OleDbCommand(ComStr,conn)Dim rd as OledbDataReader'生成 DataReader 对象rd = Com.ExecuteReader()'判断用户是否存在

Page 39: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

if not rd.Read() thenLabel1.Text="用户名、密码有误! "exit subend if'判断用户权限if rd.Item(0)="管理员 " thenResponse.Redirect("admin.aspx")else Session("username") = Name.Text Session("pwd") = Pwd.TextSession("userid") = rd.Item(1)Response.Redirect("Exam.aspx")end if End Sub 首先,根据用户名和密码,在用户表 user1 中查询该用户是否存在。如果不存在,提示“用户名或密码错误”。如果存在,判断用户权限是管理员,还是学生。如果是管理员,则跳转到管理页面。如果是学生,则在会话变量中存储“用户名”、“用户号”和“密码”,并跳转到“考试或查询成绩选择”页面。

Page 40: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

2. 完整代码<%@ Import Namespace="system.Data" %><%@ Import Namespace="system.Data.Oledb" %><%@ Page Language="VB" Debug="true" %><HTML><HEAD><TITLE>网上考试系统 </TITLE><Script Language="VB" runat="server">Dim conn as OleDbConnectionDim conStr,comStr as String Sub Page_Load(Sender As object,e As Eventargs) '建立数据库连接conStr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="conStr=conStr & server.mappath("EXAM.MDB")conn = New OleDbConnection(conStr)Conn.Open() End Sub Sub OnLogin_Click(Sender As Object, e As EventArgs)Dim com as OleDbCommand ComStr = "Select Power,UserID From user1 Where UserName='"

Page 41: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

ComStr=ComStr & Trim(Name.Text) & "' And Pwd='" & Trim(Pwd.Text) & "'"Com = New OleDbCommand(ComStr,conn)Dim rd as OledbDataReader'生成 DataReader 对象rd = Com.ExecuteReader()'判断用户是否存在if not rd.Read() thenLabel1.Text="用户名、密码有误! "exit subend if'判断用户权限if rd.Item(0)="管理员 " thenResponse.Redirect("admin.aspx")else Session("username") = Name.Text Session("pwd") = Pwd.TextSession("userid") = rd.Item(1)Response.Redirect("Exam.aspx")end if End Sub </Script></HEAD>

Page 42: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

<BODY><FORM runat="Server"><p><p><CENTER><FONT size=6 COLOR="Blue">网上考试系统 </FONT><HR><P align="center"><asp:Label id="Bulletin" ForeColor="Blue" runat="server">用户登陆 </asp:Label><P>姓 名: <asp:TextBox id="Name" runat="server" size="14"/><asp:RequiredFieldValidator id="NameValid"ControlToValidate="Name"runat="server">( 请输入姓名! )</asp:RequiredFieldValidator><p>密 码: <asp:TextBox id="Pwd" TextMode="Password"runat="server"size="16"/><asp:RequiredFieldValidator id="PwdValid" ControlToValidate="Pwd"

Page 43: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

runat="server">( 请输入密码! )</asp:RequiredFieldValidator><p><asp:Button id="Login"Text="登 陆 "Runat="server"OnClick="OnLogin_Click"/><asp:Hyperlink id="Return"Text=" 返 回 "Runat="server"NavigateUrl="main.aspx"/><asp:Label id="label1" runat="server"/></FORM></CENTER></BODY></HTML>

Page 44: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

9.6 9.6 在线考试在线考试

“ 在线考试”主要完成的功能是:根据组卷情况从试题库中随机抽取试题;给用户的试卷评分。9.6.1 考试页面设计考试页面上使用的控件如表 9-9 所示,运行后的效果如图 9-14 所示。

Page 45: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

表 9-9 控件及属性控件类型 控件名 属性 含义Label Score Font-Bold 设为 True Font-Size 设为 20pt ForeColor 设为 Red

显示考试分数

Label Label1 显示考试名称DataList SingleChoice 显示单项选择题DataList MultiChoice 显示多项选择题DataList Judge 显示判断题Button Submit Text 为“交卷” 提交试卷Button Return Text 为“返回” 返回到上一级页面

Page 46: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/图 9-14 在线考试页面

Page 47: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

9.6.2 考试页面实现 考试页面只使用一个文件 paper.aspx来实现。1.获取试题参数 在网上考试系统中,实现了“单项选择题”、“多项选择题”和“判断题”考试题型,并能根据考生考试情况自动评分。 为了在考试中,按照要求来抽取试题。必须在“组卷”页面中确定具体要求,即每次考试考什么样的题型、题量、每题分数等。这些要求都保存在 Paper 数据表中。因此,每次出题时都要查询该表以获取这些信息。这里使用一个过程 ReadPaper 来实现,具体代码如下:Sub ReadPaper()Dim conn as OledbConnectionDim com as OledbCommandDim rd As OledbDataReaderDim conStr As String ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("EXAM.MDB")Dim SQL As StringSQL="select type1,number1,score1,type2,number2,score2"SQL=SQL & ",type3,number3,score3,examname,examid from paper "SQL=SQL & " where examdate=(select max(examdate) from paper) "conn = New OleDbConnection(conStr)'建立与 Exam 数据库的连接Conn.Open()'生成命令对象

Page 48: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

Com = New OledbCommand(SQL,conn)'查询 Paper 数据表,并把结果放入 DataReader 中rd=Com.ExecuteReader()' 初始化题目类型type1="type"type2="type"type3="type"If rd.read() ' 获取考试名称,并在 Label上显示出来label1.Text=rd.GetString(9)'如果 Paper 数据表的 type1 字段不为空,说明有单项选择题if not rd.IsDbNull(0) then' 获取单项选择题type1=trim(rd.GetString(0))' 获取单选选择题的数目number1=rd.GetInt16(1)' 获取单项选择题的分数score1=rd.GetFloat(2)end if'如果 Paper 数据表的 type2 字段不为空,说明有多项选择题if not rd.IsDbNull(3) thentype2=trim(rd.GetString(3))number2=rd.GetInt16(4)score2=rd.GetFloat(5)end if

Page 49: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

'如果 Paper 数据表的 type3 字段不为空,说明有判断题if not rd.IsDbNull(6) thentype3=trim(rd.GetString(6))number3=rd.GetInt16(7)score3=rd.GetFloat(8)end if' 获取考试号,并存放在会话变量 examid 中session("examid")=rd.GetInt32(10)end Ifrd.close()conn.Close()End Sub在 Paper 数据表中,可以保存多个组卷信息,而我们只需要本次考试的组卷信息,因此采用只获取组卷时间离我们最近的记录,即 SQL 语句中的Where子句:examdate=(select max(examdate) from paper)然后,判断 Paper 数据表的题型字段。如果相应的题型字段不为空,则表示考试中有该题型。提取该题型的相应信息。最后,把考试号保存在会话变量 examid 中,供程序的其他部分使用。

Page 50: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

2. 在线考试要求从试题库中随机抽取试题组成试卷,并且用 DataList控件显示出来。这就需要为 DataList控件动态产生数据源,即创建一个动态表。本系统中,使用两个过程产生动态表,即创建动态表过程 CreateTable 和创建动态表列过程 CreateColumn。创建动态表:Sub CreateTable()'生成动态表对象dt = New DataTable("Paper")'为动态表生成相应列,这些列为 SubjectID 、 question、 option1 、option2 、 option3 、 option4 、 answerCreateColumn("System.Int32","SubjectID")CreateColumn("System.String","question")CreateColumn("System.String","option1")CreateColumn("System.String","option2")CreateColumn("System.String","option3")CreateColumn("System.String","option4")CreateColumn("System.String","answer")End Sub

Page 51: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

创建动态表的每一列:Sub CreateColumn(Byval DataType As String,Byval ColumnName As String)Dim dc As DataColumn'生成列对象dc = New DataColumn()with dc '确定该列的数据类型.DataType = System.Type.GetType(DataType)'确定该列的列名.ColumnName = ColumnNameend with' 把生成的列添加到动态表中dt.Columns.Add(dc)End Sub

Page 52: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

3. 随机出题随机出题的算法为:把某类试题(例如,单项选择题)都填充到一个数据集中Dim ad As OledbDataAdapterDim ds As DataSetSQL = "select * from subject where type='单项选择题 '"ad=New OledbDataAdapter(SQL,conn)ds = New DataSet()ad.Fill(ds, "Single")获取数据集中的题目数Dim count=ds.Tables(0).Rows.Count以该数作为种子,利用随机函数生成试题号Dim examid As Integer = CInt(Int(count * Rnd()))把数据集中该试题号的试题内容作为一行填充到动态表中Dim dr As DataRow = dt.NewRow()dr("SubjectID")=ds.Tables(0).Rows(examid)("SubjectID")dr("question")=ds.Tables(0).Rows(examid)("question")dt.Rows.Add(dr)

Page 53: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

随机出题主要在 MakePaper 过程中实现,具体代码如下:Sub MakePaper(Byval str As String,Byval number As Integer)Dim conn as OledbConnectionDim conStr As String ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("EXAM.MDB")Dim ad as OledbDataAdapterDim ds as DatasetDim i,examid As IntegerDim count As Integer ' 某项题型的试题数目Dim dr As DataRowconn = New OleDbConnection(conStr)Conn.Open()dt.Clear()'生成某类试题的所有题目For i=0 to number -1ad=New OledbDataAdapter(Str,conn)ds = New DataSet()ad.Fill(ds, "Single")count=ds.Tables(0).Rows.Countexamid = CInt(Int(count * Rnd()))dr = dt.NewRow()

Page 54: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

dr("SubjectID")=ds.Tables(0).Rows(examid)("SubjectID")dr("question")=ds.Tables(0).Rows(examid)("question")dr("option1")=ds.Tables(0).Rows(examid)("option1")dr("option2")=ds.Tables(0).Rows(examid)("option2")dr("option3")=ds.Tables(0).Rows(examid)("option3")dr("option4")=ds.Tables(0).Rows(examid)("option4")dr("answer")=ds.Tables(0).Rows(examid)("answer")dt.Rows.Add(dr)Nextconn.Close()End Sub4. 实现考试页面考试页面的主控部分在 Page_Load 中实现,具体代码如下:Sub Page_Load(Sender As object,e As Eventargs)Dim SQL As Stringif not page.ispostback then'创建动态表CreateTable()' 读出试题参数ReadPaper()' 产生单项选择题

Page 55: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

Randomize(timer)SQL = "select * from subject where type='单项选择题 '"if type1<>"type" thenMakePaper(SQL,number1)' 绑定 DataList控件,使之显示所有的单项选择题SingleChoice.DataSource=dt.defaultviewSingleChoice.databind()end if' 产生多项选择题SQL = "select * from subject where type=' 多项选择题 '"if type2<>"type" thenMakePaper(SQL,number2)MultiChoice.DataSource=dt.defaultviewMultiChoice.databind()end if' 产生判断题SQL = "select * from subject where type='判断题 '"if type3<>"type" thenMakePaper(SQL,number3)Judge.DataSource=dt.defaultviewJudge.databind()end if end ifEnd Sub

Page 56: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

首先创建动态表,用于存放试题;然后,读出组卷的参数;最后,根据type1<>"type"、 type2<>"type"、 type3<>"type"判断本次考试是否有单项选择、多项选择和判断题。如果有相应题型,则随机抽取试题,并用 DataList控件把试题显示出来。5. 单项选择题的评分单项选择题的评分在 SingleScore函数中实现,他返回所有单项选择的总分,具体代码如下:Function SingleScore() As Single Dim s1,s2,s3,s4 As RadioButton Dim tmp As DataListItem Dim SingleID,SingleAnswer,SScore As Label Dim SingleResult As Image Dim i As Integer Dim TotalScore As Single = 0 Dim ans As String

Page 57: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

Dim ans As String For i=0 To SingleChoice.Items.Count-1'在单项选择题的 DataList控件模板中寻找各选项控件tmp = SingleChoice.Items(i)s1 = tmp.FindControl("Single1")s2 = tmp.Findcontrol("Single2")s3 = tmp.FindControl("Single3")s4 = tmp.FindControl("Single4")SingleID = tmp.FindControl("SingleID")SingleAnswer = tmp.FindControl("SingleAnswer")SScore = tmp.FindControl("SingleScore")SingleResult = tmp.FindControl("SingleResult")'判断用户是否选择了该选项If s1.Checked Then ans = "A"Else If s2.Checked Then ans = "B"Else If s3.Checked Then ans = "C"Else If s4.Checked Then ans = "D" Else ans = "0"End If

Page 58: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

SingleResult.Visible="True"'如果用户选择的选项正确,则累加总分,并显示一幅表示正确的图像,否则只显示一幅表示错误的图像 if ans = trim(SingleAnswer.Text) Then TotalScore = TotalScore + Single.Parse(SScore.Text) SingleResult.ImageUrl="Right1.jpg"else SingleResult.ImageUrl="error1.jpg" End IF Next' 返回单项选择题的总分 return TotalScore End Function程序中,首先利用一个 For循环在单项选择题的 DataList控件模板中寻找各选项控件;然后,根据选项控件是否被选择来判断用户选择的选项;最后,根据用户选择的选项是否正确,决定是累加总分,还是不累加总分。多项选择题和判断题的评分与单项选择题类似,这里就不再赘述。评分页面如图 9-15 所示。

Page 59: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/图 9-15 评分页面

Page 60: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

6.全部代码<%@ Page Language="VB" Debug="true" %><%@ Import Namespace="system.Data" %><%@ Import Namespace="system.Data.Oledb" %><Html><Head><Title>网上考试系统 </Title><Script Language="VB" runat="Server">Dim dt As DataTable '动态表Dim score1,score2,score3 As SingleDim number1,number2,number3 As IntegerDim type1,type2,type3 As stringDim num As IntegerDim examname As StringSub Page_Load(Sender As object,e As Eventargs)Dim SQL As Stringif not page.ispostback thenCreateTable()ReadPaper()Randomize(timer)SQL = "select * from subject where type='单项选择题 '"

Page 61: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

if type1<>"type" thenMakePaper(SQL,number1)SingleChoice.DataSource=dt.defaultviewSingleChoice.databind()end ifSQL = "select * from subject where type=' 多项选择题 '"if type2<>"type" thenMakePaper(SQL,number2)MultiChoice.DataSource=dt.defaultviewMultiChoice.databind()end ifSQL = "select * from subject where type='判断题 '"if type3<>"type" thenMakePaper(SQL,number3)Judge.DataSource=dt.defaultviewJudge.databind()end if end ifEnd SubSub CreateTable()dt = New DataTable("Paper")CreateColumn("System.Int32","SubjectID")CreateColumn("System.String","question")CreateColumn("System.String","option1")CreateColumn("System.String","option2")

Page 62: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

CreateColumn("System.String","option3")CreateColumn("System.String","option4")CreateColumn("System.String","answer")End SubSub CreateColumn(Byval DataType As String,Byval ColumnName As String)Dim dc As DataColumndc = New DataColumn()with dc .DataType = System.Type.GetType(DataType).ColumnName = ColumnNameend withdt.Columns.Add(dc)End SubSub ReadPaper()Dim conn as OledbConnectionDim com as OledbCommandDim rd As OledbDataReaderDim conStr As String ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("EXAM.MDB")Dim SQL As String="select type1,number1,score1,type2,number2,score2,type3,number3,score3,examname,examid from paper"

Page 63: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

conn = New OleDbConnection(conStr)Conn.Open()Com = New OledbCommand(SQL,conn)rd=Com.ExecuteReader()type1="type"type2="type"type3="type"while rd.read() label1.Text=rd.GetString(9)if not rd.IsDbNull(0) thentype1=trim(rd.GetString(0))number1=rd.GetInt16(1)score1=rd.GetFloat(2)end ifif not rd.IsDbNull(3) thentype2=trim(rd.GetString(3))number2=rd.GetInt16(4)score2=rd.GetFloat(5)end ifif not rd.IsDbNull(6) thentype3=trim(rd.GetString(6))number3=rd.GetInt16(7)score3=rd.GetFloat(8)end if

Page 64: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

session("examid")=rd.GetInt32(10)end whilerd.close()conn.Close()End SubSub MakePaper(Byval str As String,Byval number As Integer)Dim conn as OledbConnectionDim conStr As String ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("EXAM.MDB")Dim ad as OledbDataAdapterDim ds as DatasetDim i,examid As IntegerDim count As IntegerDim dr As DataRowconn = New OleDbConnection(conStr)Conn.Open()dt.Clear()For i=0 to number -1ad=New OledbDataAdapter(Str,conn)ds = New DataSet()ad.Fill(ds, "Single")count=ds.Tables(0).Rows.Countexamid = CInt(Int(count * Rnd()))

Page 65: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

dr = dt.NewRow()dr("SubjectID")=ds.Tables(0).Rows(examid)("SubjectID")dr("question")=ds.Tables(0).Rows(examid)("question")dr("option1")=ds.Tables(0).Rows(examid)("option1")dr("option2")=ds.Tables(0).Rows(examid)("option2")dr("option3")=ds.Tables(0).Rows(examid)("option3")dr("option4")=ds.Tables(0).Rows(examid)("option4")dr("answer")=ds.Tables(0).Rows(examid)("answer")dt.Rows.Add(dr)Nextconn.Close()End SubSub OnSubmit_Click(Sender As object,e As Eventargs)Dim conn as OledbConnectionDim com as OledbCommandDim conStr As String ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("EXAM.MDB")Dim SQL As StringDim total As Singleconn = New OleDbConnection(conStr)Conn.Open()

Page 66: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

total = SingleScore() + MultiScore() + JudgeScore()SQL="insert into score(userid,examid,score) values(" & session("userid") & "," & session("examid") & "," & total & ")"Com = New OledbCommand(SQL,conn)Com.ExecuteNonQuery()Score.Text = " 总成绩为: " & total & "分 "conn.close()End SubFunction SingleScore() As Single Dim s1,s2,s3,s4 As RadioButton Dim tmp As DataListItem Dim SingleID,SingleAnswer,SScore As Label Dim SingleResult As Image Dim i As Integer Dim TotalScore As Single = 0 Dim ans As String For i=0 To SingleChoice.Items.Count-1 tmp = SingleChoice.Items(i)s1 = tmp.FindControl("Single1")s2 = tmp.Findcontrol("Single2")s3 = tmp.FindControl("Single3")s4 = tmp.FindControl("Single4")

Page 67: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

SingleID = tmp.FindControl("SingleID")SingleAnswer = tmp.FindControl("SingleAnswer")SScore = tmp.FindControl("SingleScore")SingleResult = tmp.FindControl("SingleResult")If s1.Checked Then ans = "A"Else If s2.Checked Then ans = "B"Else If s3.Checked Then ans = "C"Else If s4.Checked Then ans = "D" Else ans = "0"End IfSingleResult.Visible="True" if ans = trim(SingleAnswer.Text) Then TotalScore = TotalScore + Single.Parse(SScore.Text) SingleResult.ImageUrl="Right1.jpg"else SingleResult.ImageUrl="error1.jpg" End IF Next return TotalScore End Function

Page 68: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

Function MultiScore() As Single Dim m1,m2,m3,m4 As CheckBox Dim tmp As DataListItem Dim MultiID,MultiAnswer,MScore As Label Dim MultiResult As Image Dim i As Integer Dim ans As String Dim TotalScore As Single Dim no As Integer For i=0 To MultiChoice.Items.Count-1 tmp = MultiChoice.Items(i) m1 = tmp.FindControl("Multi1") m2 = tmp.Findcontrol("Multi2") m3 = tmp.FindControl("Multi3") m4 = tmp.FindControl("Multi4") MultiID = tmp.FindControl("MultiID") MultiAnswer = tmp.FindControl("MultiAnswer") MScore = tmp.FindControl("MultiScore") MultiResult = tmp.FindControl("MultiResult")

Page 69: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

If m1.Checked Then ans = "A" Else ans = "0" End If If m2.Checked Then ans &= "B" Else ans &= "0" End If If m3.Checked Then ans &= "C" Else ans &= "0" End If If m4.Checked Then ans &= "D" Else ans &= "0" End If MultiResult.Visible="True" if ans = Trim(MultiAnswer.Text) Then TotalScore = TotalScore + Single.Parse(MScore.Text)MultiResult.ImageUrl="Right1.jpg"

Page 70: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

else MultiResult.ImageUrl="error1.jpg" End IF Next return TotalScore End Function Function JudgeScore() As Single Dim j1,j2 As RadioButton Dim tmp As DataListItem Dim JudgeID,JudgeAnswer,JScore As Label Dim JudgeResult As Image Dim i As Integer Dim TotalScore As Single Dim ans As String For i=0 To Judge.Items.Count-1 tmp= Judge.Items(i) j1 = tmp.FindControl("Judge1") j2 = tmp.Findcontrol("Judge2") JudgeID = tmp.FindControl("JudgeID") JudgeAnswer = tmp.FindControl("JudgeAnswer")JScore = tmp.FindControl("JudgeScore")JudgeResult = tmp.FindControl("JudgeResult")

Page 71: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

If j1.Checked Then ans = "Y" ElseIf j2.Checked Then ans = "N" Else ans = "0" End If JudgeResult.Visible="True" if ans = Trim(JudgeAnswer.Text) Then TotalScore = TotalScore + Single.Parse(JScore.Text)JudgeResult.ImageUrl="Right1.jpg" else JudgeResult.ImageUrl="error1.jpg" End IF Nextreturn TotalScore End Function Sub OnReturn_Click(byval Sender As object,e As Eventargs)Response.Redirect("exam.aspx")End Sub</Script></Head><Body><form runat="server"><P>

Page 72: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

<asp:Label id="Label1" Font-Bold="True" Font-Size="26pt" ForeColor="Orange" runat="server" /><P><asp:Label id="Score" Font-Bold="True" Font-Size="20pt" ForeColor="Red" runat="server" /><P><asp:DataList id="SingleChoice" runat="server"> <HeaderTemplate><HR><P> <b><Font color="Blue" size="5"><%#type1%>( 共 <%#number1%>题,每题 <%#score1%>分 )</b></FONT> <table border=0 width="740"> <% num=0 %> </HeaderTemplate> <ItemTemplate> <% num=num+1 %> <tr> <td bgcolor="#EFEFEF"><FONT COLOR="BLUE"> <%=num%>、 &nbsp; <%# DataBinder.Eval(Container.DataItem, "question") %><asp:Label id="SingleID" visible="False" Text='<%# DataBinder.Eval(Container.DataItem, "SubjectID")%>' runat="server" />

Page 73: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

<asp:Label id="SingleAnswer" visible="False" Text='<%# DataBinder.Eval(Container.DataItem, "answer")%>' runat="server" /> <asp:Label id="SingleScore" visible="False" Text='<%# score1%>' runat="server" /> </font></td> </tr><tr><td><asp:RadioButton id="Single1" GroupName="S" runat="Server" Text='<%# DataBinder.Eval(Container.DataItem, "option1")%>'/> </td> </tr> <tr> <td> <asp:RadioButton id="Single2" GroupName="S" runat="Server" Text='<%# DataBinder.Eval(Container.DataItem, "option2")%>'/> </td> </tr> <tr><td> <asp:RadioButton id="Single3" GroupName="S" runat="Server" Text='<%# DataBinder.Eval(Container.DataItem, "option3")%>'/>

Page 74: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

</td> </tr> <tr><td> <asp:RadioButton id="Single4" GroupName="S" runat="Server" Text='<%# DataBinder.Eval(Container.DataItem, "option4")%>'/> </td> </tr> <tr><td> <asp:Image id="SingleResult" Visible="False" runat="Server" /> </td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:DataList><P> <asp:DataList id="MultiChoice" runat="server"> <HeaderTemplate> <HR><P> <b><Font color="Blue" size="5"><%#type2%>( 共 <%#number2%>题,每题 <%#score2%>分 )</b></FONT> <table border=0 width="740"> <% num=0 %>

Page 75: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

</HeaderTemplate> <ItemTemplate> <% num=num+1 %> <asp:Label id="MultiID" visible="False" Text='<%# DataBinder.Eval(Container.DataItem, "SubjectID")%>' runat="server" /> <asp:Label id="MultiAnswer" visible="False"Text='<%# DataBinder.Eval(Container.DataItem, "answer")%>'runat="server" /> <asp:Label id="MultiScore" visible="False"Text='<%# score2%>' runat="server" /> <tr> <td bgcolor="#EFEFEF"><FONT COLOR="BLUE"> <%=num%>、 &nbsp; <%# DataBinder.Eval(Container.DataItem, "question") %> </font></td> </tr> <tr> <td> <asp:CheckBox id="Multi1" runat="Server"Text='<%# DataBinder.Eval(Container.DataItem, "option1")%>'/> </td> </tr> <tr> <td>

Page 76: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

<asp:CheckBox id="Multi2" runat="Server" Text='<%# DataBinder.Eval(Container.DataItem, "option2")%>'/> </td> </tr> <tr> <td> <asp:CheckBox id="Multi3" runat="Server" Text='<%# DataBinder.Eval(Container.DataItem, "option3")%>'/> </td> </tr> <tr> <td> <asp:CheckBox id="Multi4" runat="Server" Text='<%# DataBinder.Eval(Container.DataItem, "option4")%>'/> </td> </tr> <tr> <td> <asp:Image id="MultiResult" Visible="False" runat="Server" /> </td> </tr> </ItemTemplate> <FooterTemplate>

Page 77: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

</table> </FooterTemplate> </asp:DataList><P> <asp:DataList id="Judge" runat="server"> <HeaderTemplate> <HR><P> <b><Font color="Blue" size="5"><%#type3%>( 共 <%#number3%>题,每题 <%#score3%>分 )</b></FONT> <table border=0 width="740"> <% num=0 %> </HeaderTemplate> <ItemTemplate> <% num=num+1 %> <asp:Label id="JudgeID" visible="False" Text='<%# DataBinder.Eval(Container.DataItem, "SubjectID")%>' runat="server" /> <asp:Label id="JudgeAnswer" visible="False" Text='<%# DataBinder.Eval(Container.DataItem, "answer")%>' runat="server" /> <asp:Label id="JudgeScore" visible="False" Text='<%# score3%>' runat="server" /> <tr> <td bgcolor="#EFEFEF" ><FONT COLOR="BLUE">

Page 78: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

<%=num%>、 &nbsp; <%# DataBinder.Eval(Container.DataItem, "question") %> </font></td> </tr> <tr> <td> <asp:RadioButton id="Judge1" GroupName="J" runat="Server" Text="对 "/> </td> </tr> <tr> <td> <asp:RadioButton id="Judge2" GroupName="J" runat="Server" Text=" 错 "/> </td> </tr> <tr> <td> <asp:Image id="JudgeResult" Visible="False" runat="Server" /> </td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate></asp:DataList><P align="center">

Page 79: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

<asp:Button id="Submit" Text=" 交 卷 " OnClick="OnSubmit_Click" runat="server"/><asp:Button id="Return" Text=" 返 回 " OnClick="OnReturn_Click" runat="server"/> </form></Body></Html>

9.7 成绩查询 “ 成绩查询”主要完成的功能是:查询用户考试成绩。9.7.1 成绩查询页面设计 成绩查询页面上使用的控件如表 9-10 所示,运行后的效果如图 9-16 所

示。

Page 80: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

表 9-10 控件及属性 控件类型 控件名 属性 含义Label Label1 Font-Bold 设为 True Font-Size 设为 26pt ForeColor 设为 Orange

显示反馈结果

DataGrid Datagrid1 显示查询结果Button Return Text 为“返回” 返回到上一级页面

Page 81: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/图 9-16 成绩查询页面

Page 82: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

9.7.2 成绩查询页面实现成绩查询页面只使用一个文件 Query.aspx来实现。使用数据库的查询 SubjectScore 实现成绩查询。代码如下:<%@ Page Language="VB" Debug="true" %><%@ Import Namespace="system.Data" %><%@ Import Namespace="system.Data.Oledb" %><Html><Head><Title>网上考试系统 </Title><Script Language="VB" runat="Server">Sub Page_Load(Sender As object,e As Eventargs)if not page.ispostback thenDim conn as OledbConnectionDim com as OledbCommandDim rd As OledbDataReaderDim conStr As String ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("EXAM.MDB")Dim SQL As StringDim total As Single'建立连接conn = New OleDbConnection(conStr)Conn.Open()'建立命令对象

Page 83: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

SQL = "select * from SubjectScore where 用户名 ='" & session("username") & "'"Com = New OledbCommand(SQL,conn)Try ' 执行 SubjectScore 查询rd = Com.ExecuteReader()catch se As OledbExceptionlabel1.Text = " 还没有您的成绩 "end try'查询结果绑定到 DataGrid控件datagrid1.datasource=rddatagrid1.databind() end ifEnd SubSub OnSubmit_Click(Sender As object,e As Eventargs)response.redirect("exam.aspx")End Sub</Script></Head><Body><form runat="server"><p><p><CENTER>

Page 84: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

<FONT size=6 COLOR="Blue">网上考试系统 </FONT><HR><P align="center"><FONT size=5 COLOR="Orange">成绩查询 </FONT><P><asp:Label id="Label1" Font-Bold="True" Font-Size="26pt" ForeColor="Orange" runat="server" /><P> <asp:DataGrid id="DataGrid1" runat="server" BorderColor="black" GridLines="Vertical" cellpadding="4" cellspacing="0" width="100%" Font-Name="Arial" Font-Size="8pt" HeaderStyle-BackColor="#cccc99" ItemStyle-BackColor="#ffffff" AlternatingItemStyle-Backcolor="#cccccc" AutoGenerateColumns="true" /><P><P> <asp:Button id="Submit" Text=" 返 回 " OnClick="OnSubmit_Click" runat="server"/></CENTER></form></Body></Html> 程序中,根据用户登录时的用户名,利用 SubjectScore 查询完成成绩查询工作。

Page 85: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

9.8 9.8 其他其他 限于篇幅,用户管理、组卷、题库管理没有给出源代码,留给读者作为练习。习题1 、完善网上考试系统,添加用户管理、组卷、题库管理功能。2 、给网上考试系统添加一个“成绩修改”功能。3 、想一想,除了单项选择题、多项选择题和判断题以外,其他题型能否实现即时判卷。如果不能,有没有其他方法完成判卷任务。4 、把用户注册页面中的“返回”超级链接,改为按钮。5 、在成绩查询模块中,为“查询成绩”建立了一个查询 SubjectScore 。如果不使用该查询,那么该如何实现,请给出 SQL语句。

Page 86: 第 9 章   ASP.NET 编程实例

http://www.wenyuan.com.cn/webnew/

<本章完 >