一、需求描述
最近在对考试系统进行优化,其中有一个要进行优化的问题就是英语试题中的完型填空题型。参加传统考试时,在试卷上完型题呈现的形式基本上是题干+要填写的空缺+空缺处一些可选答案。当然传统考试答题卡也是不可缺少的。所以在考试系统3.5中处理这样的问题自然而然就是模仿传统试卷考试样式,首先加载的是题干,当然题干中还是要将要填的空空出来,然后是加载空缺出将要添加的可选的选项,最后是放置一些文本框以模拟答题卡。
完型填空效果图:
二、出现的问题
这样做出来界面效果看上去还可以,但是学生考试过程中却不知道在下边文本框中是填选项呢还是填单词答案呢?作为开发人员我们知道为了方便统计分数(计算机自动判分),我们要的正确答案是A、B、C、D,而不是正确答案的单词。软件出了问题自然是要优化的,至少为了增强用户的体验效果。
三、优化方案
1、最简单的优化方法就是在文本框上方添加一行提示语,提示用户在文本框中填选项还是正确答案单词。虽然这是最简单的优化方案,整体的视觉效果也算是不错,但是给用户的感觉却不是那么简单明了。
2、将填写文本框的答题卡去掉,将试题的选项设置为单选按钮,学生答题时只需要在其中一个答案中做出选择即可。这个方案听上去还可以,但效果出来却差强人意。因为是机考所以并不是像传统纸质试卷那样,如果完型填空题有20个选项的话,这样所有选项基本上就占满了整个屏幕,令人眼花缭乱,带来的视觉效果显得非常差。
图;
3、第三个优化方案即将原方案中的文本框更换为下拉选项卡,同时也需要将原方案中的选项去掉。这个方案相对前两个方案来说可行性还是比较高的。但是既然考虑到要将文本框更换为下拉菜单,就不能是简单的替换了,完全可以将下拉菜单穿插到试题中。所以这样第四个方案就出来了。
4、将试题的选项全部去掉,取而代之的是下拉菜单,并将带有选项的下拉菜单穿插到试题中。
四、优化实施
既然是要优化当然是朝着最好的优化方案靠拢,即将文本框换为下拉菜单。方案有了,要想实现只需要将文本框控件替换为下拉列表实现即可,这样的实现在技术上也是相对比较简单的。但真实的情况却不是这样的。
SQLSERVER数据库
考虑到在数据库中题干是作为一个整体存储到数据库中的,这样存取都比较方便。但这样的话在题中插入下拉菜单就出现问题了。既然是插入自然就需要将题干分割确定插入点的位置,由于数据存储的方式,需要的是要在试题的存储时就要确定分割的位置,这样才可以实现在试题显示时在空缺处插入下拉框。自然而然的题干存储时需要一个标识符,以便后期进行分割。缺一个标识符,这在平时相对来说相对来说还是比较简单的,但在英语考试中却成了问题。因为任何一个英文字母或符号都可能出现在英语试卷中,这会对分割判断产生相当大的影响。
MongoDB数据库
在mongodb数据库中,数据存储的形式并不是像关系型数据库那样以记录为单位构成表,表与表之间相互关联,而是以集合的形式存储。集合的存储方式完全符合我们的需求,我们只需要将这个题干分为几部分存储到一个集合中,这样后期处理插入点也就相对简单了。
五、测试Demo及实现效果
MongoTest类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MongoDB.Bson;
using MongoDB.Driver;
namespace ExamSystemV3
{
public class MongoTest
{
string conn = "mongodb://127.0.0.1:27017";//设置连接及端口
string dbname = "test";//数据库名
MongoServer server;
MongoDatabase db;
public MongoTest()
{
server = MongoDB.Driver.MongoServer.Create(conn);
db = server.GetDatabase(dbname);
}
public LinkedList<string> getData()
{
MongoCollection col = db.GetCollection("Paragraphs");
//查询全部集合里的数据
var result1 = col.FindAllAs<Paragraphs>();
col.FindAs<Paragraphs>(new QueryDocument());
var result = col.FindAs<Paragraphs>(query);
Paragraphs cc = result1.ElementAt(0);
String ee = cc.List.ToArray()[0];
return cc.List;
}
}
}
试题实体类:Paragraphs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MongoDB.Bson;
namespace ExamSystemV3
{
public class Paragraphs
{
private ObjectId _id;
private LinkedList<string> list = new LinkedList<string>();
public void add(string content)
{
this.list.AddLast(content);
}
public LinkedList<string> List
{
get { return list; }
set { list = value; }
}
public ObjectId Id
{
get { return _id; }
set { _id = value; }
}
}
}
LinkedList<string > quest= new MongoTest().getData();
foreach (string qu in quest)
{
Label lbllianjie = new Label();//将试题放在Label中显示
lbllianjie.Text = "__";//下拉框与文字分割符
Label lbllianjie1 = new Label();
lbllianjie1.Text = "__";//下拉框与文字分割符
Label lblquest = new Label();
lblquest.Text = qu;
DropDownList drd = new DropDownList();
drd.Items.Add("aa");//虚拟试题答案选项
drd.Items.Add("bb");
drd.Items.Add("cc");
isExaming.Controls.Add(lblquest);
isExaming.Controls.Add(lbllianjie1);
isExaming.Controls.Add(drd);
isExaming.Controls.Add(lbllianjie);
}
效果图: