简单版问卷调查系统(Asp.Net+SqlServer2008)
1.系统主要涉及以下几个表
问卷项目表(Q_Naire) 问卷题目表(Q_Problem) 题目类型表(Q_ProblmeType)
题目选项表(Q_Options) 调查结果表(Q_Answer) 参与用户表(Q_User)
2.涉及的存储过程
pNextID 获取实体表主键ID
sp_NaireAnswer 将问卷调查的结果写入结果表(通过WebService方法调用)
sp_NaireImport 通过导入的问卷数据生成问卷项目(根据Q_Naire_Import表中的问卷数据分别写入Q_Naire、Q_Problem、Q_Options中生成问卷)
sp_NaireResult 问卷调查结果数据集
3.系统实现方式
后台:主要是通过后台维护的问卷数据,根据问卷项目编号获取问卷题目以及题目类型
然后根据题目类型在后台生成相应的控件,后台控件生成通过Asp.Net实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data; namespace QuestionnaireSurveySystem
{
public partial class Naire : System.Web.UI.Page
{
/// <summary>
/// 问卷编号
/// </summary>
public string nid = string.Empty;
/// <summary>
/// 用户编号
/// </summary>
public string uid = string.Empty;
/// <summary>
/// 数据库连接字符串
/// </summary>
private string constr = ConfigHelper.GetConfigString("System.ConnectionString"); protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
try
{
if (Request.Params["uid"].ToString() != null && Request.Params["uid"].ToString().Trim() != "")
{
uid = Request.Params["uid"].ToString();
}
if (Request.Params["nid"].ToString() != null && Request.Params["nid"].ToString().Trim() != "")
{
nid = Request.Params["nid"].ToString();
//绑定题目
BindNaire(nid);
}
}
catch
{
Response.Redirect("Error.html");
}
}
}
/// <summary>
/// 动态生成问卷表单
/// </summary>
/// <param name="id">问卷项目编号</param>
private void BindNaire(string id)
{
SqlConnection con = new SqlConnection(constr);
con.Open();
DataTable dt = new DataTable();
DataTable dt2 = new DataTable();
SqlDataAdapter sda = new SqlDataAdapter("SELECT b.ID AS Nid,b.Title,b.Descr,a.ID AS Pid,a.Title,d.TypeName,c.ID AS Oid,c.OptionValue FROM dbo.Q_Problem a LEFT JOIN dbo.Q_Naire b ON a.Nid=b.ID LEFT JOIN dbo.Q_Options c ON a.ID=c.Pid LEFT JOIN dbo.Q_ProblmeType d ON a.Tid=d.ID WHERE b.ID=" + id + "", con);
sda.Fill(dt);
SqlDataAdapter sda2 = new SqlDataAdapter("SELECT a.ID as Pid,a.Title,a.Nid,a.Tid,b.TypeName,b.Descr FROM dbo.Q_Problem a LEFT JOIN dbo.Q_ProblmeType b ON a.Tid=b.ID WHERE a.Nid=" + id + " ORDER BY a.Tid ASC", con);
sda2.Fill(dt2);
lbltitle.Text = dt.Rows[]["Title"].ToString();
lbldescr.Text = dt.Rows[]["Descr"].ToString(); int sid = ;//单选题序号
int mid = ;//多选题序号
int aid = ;//问答题序号 if (dt2.Rows.Count > )
{
foreach (DataRow dr in dt2.Rows)
{
switch (dr["TypeName"].ToString())
{
case "单选题":
Label lbl = new Label();
lbl.Text = sid.ToString() + "、" + dr["Title"].ToString();
RadioButtonList rbl = new RadioButtonList();
rbl.ID = dr["Pid"].ToString();
DataRow[] drs = dt.Select("Pid=" + dr["Pid"] + "");
foreach (DataRow drc in drs)
{
ListItem li1 = new ListItem();
li1.Text = drc["OptionValue"].ToString();
li1.Value = drc["Oid"].ToString();
rbl.Items.Add(li1);
}
if (sid == )
{
Label lblss = new Label();
lblss.Text = "单选题";
lblss.Font.Bold = true;
this.Panel1.Controls.Add(lblss);
this.Panel1.Controls.Add(new LiteralControl("<br/>"));
}
this.Panel1.Controls.Add(lbl);
this.Panel1.Controls.Add(new LiteralControl("<br/>"));
this.Panel1.Controls.Add(rbl);
this.Panel1.Controls.Add(new LiteralControl("<br/>"));
sid = sid + ;
break;
case "多选题":
Label lbl2 = new Label();
lbl2.Text = mid.ToString() + "、" + dr["Title"].ToString();
CheckBoxList cbl = new CheckBoxList();
cbl.ID = dr["Pid"].ToString();
DataRow[] drs2 = dt.Select("Pid=" + dr["Pid"] + "");
foreach (DataRow drc in drs2)
{
ListItem li2 = new ListItem();
li2.Text = drc["OptionValue"].ToString();
li2.Value = drc["Oid"].ToString();
cbl.Items.Add(li2);
}
if (mid == )
{
Label lblms = new Label();
lblms.Text = "多选题";
lblms.Font.Bold = true;
this.Panel1.Controls.Add(lblms);
this.Panel1.Controls.Add(new LiteralControl("<br/>"));
}
this.Panel1.Controls.Add(lbl2);
this.Panel1.Controls.Add(new LiteralControl("<br/>"));
this.Panel1.Controls.Add(cbl);
this.Panel1.Controls.Add(new LiteralControl("<br/>"));
mid = mid + ;
break;
case "问答题":
Label lbl3 = new Label();
lbl3.Text = aid.ToString() + "、" + dr["Title"].ToString();
TextBox txb = new TextBox();
txb.ID = dr["Pid"].ToString();
txb.TextMode = TextBoxMode.MultiLine;
txb.Width = Unit.Pixel();
txb.Height = Unit.Pixel(); if (aid == )
{
Label lblas = new Label();
lblas.Text = "问答题";
lblas.Font.Bold = true;
this.Panel1.Controls.Add(lblas);
this.Panel1.Controls.Add(new LiteralControl("<br/>"));
}
this.Panel1.Controls.Add(lbl3);
this.Panel1.Controls.Add(new LiteralControl("<br/>"));
this.Panel1.Controls.Add(txb);
this.Panel1.Controls.Add(new LiteralControl("<br/>"));
aid = aid + ;
break;
}
}
}
//关闭连接 释放资源
con.Close();
Dispose();
}
}
}
前台:通过JavaScript方法获取用户选择项,作为参数传递给后台WebService方法,然后调用存储过程将问卷结果写入数据库
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Naire.aspx.cs" Inherits="QuestionnaireSurveySystem.Naire" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
//获取问卷填写内容
function GetRadioValue()
{
var p = document.getElementsByTagName("input");
var v = "";
for (var i = ; i < p.length; i++)
{
if (p[i].checked)
{
v = v + p[i].name.split('$')[] + "." + p[i].value + ",";
}
}
var t = document.getElementsByTagName("textarea");
for (var i = ; i < t.length; i++)
{
/*处理输入中的"."*/
v = v + t[i].id + "." + t[i].value.toString().split('.').join('') + ",";
}
v = v.substring(, v.length - );
return v;
} //判断是否填写完整
function CheckSelect()
{
/*
在使用indexOf方法前,执行一下下面的js,
原理就是如果发现数组没有indexOf方法,会添加上这个方法
*/
if (!Array.prototype.indexOf)
{
Array.prototype.indexOf = function (elt /*, from*/)
{
var len = this.length >>> ;
var from = Number(arguments[]) || ;
from = (from < ) ? Math.ceil(from) : Math.floor(from);
if (from < )
from += len;
for (; from < len; from++)
{
if (from in this && this[from] === elt)
return from;
}
return -;
};
}
/*
*/
var ok = false;//完成标志
var no = new Array();//应完成项
var nn = new Array();//已完成项
var s = document.getElementsByTagName('input');//选择项
for (var i = ; i < s.length; i++)
{
var n = s[i].name.split('$')[].toString(); if (no.indexOf(n) < && s[i].type == "radio")
{
no.push(n)
}
if (no.indexOf(n) < && s[i].type == "checkbox")
{
no.push(n)
}
if (s[i].checked && nn.indexOf(n) < && s[i].type == "radio")
{
nn.push(n);
}
if (s[i].checked && nn.indexOf(n) < && s[i].type == "checkbox")
{
nn.push(n);
}
}
var t = document.getElementsByTagName("textarea");
for (var i = ; i < t.length; i++)
{
var m = t[i].name.split('$')[];
if (no.indexOf(m) < )
{
no.push(n)
}
if (t[i].value != null && t[i].value != "")
{
nn.push(n)
}
}
if (nn.length < no.length)
{
ok = false;
}
else
{
ok = true;
}
return ok;
} //将填写内容写入数据库
function Insert()
{
var ok = CheckSelect();
if (ok)
{
var r = GetRadioValue();
if (r != "")
{
var f=Select();
if(f)
{
var uid=<%=uid %>;
var nid=<%=nid %>;
var URL = "Server/NaireService.asmx/RecordResult"
var Params = "uid=" + uid + "&nid="+nid+"&val=" + r + ""; //传给WebService的参数
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.Open("POST", URL, false); //用POST方法
xmlhttp.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.SetRequestHeader("Content-Length", Params.length);
xmlhttp.send(Params);
if (xmlhttp.Status == )
{
//200代表成功
alert("提交成功,谢谢您的参与和支持!");
//刷新页面
location.reload();
}
}
else{
alert("您已经完成问卷,不用重复提交!");
}
}
else
{
alert("内容不可为空!");
}
}
else
{
alert("所有调查项完成后才可以提交,请检查!");
}
} function Select()
{
var uid=<%=uid %>;
var nid=<%=nid %>;
var URL = "Server/NaireService.asmx/IsHasCarry";
var Params = "uid=" + uid + "&nid="+nid+""; //传给WebService的参数
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.Open("POST", URL, false); //用POST方法
xmlhttp.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.SetRequestHeader("Content-Length", Params.length);
xmlhttp.send(Params);
if (xmlhttp.Status == )
{
//200代表成功
var res = xmlhttp.responseXML; //得到WebService传回的结果
var strJSON = res.childNodes[].text;
var obj = eval("(" + strJSON + ")"); //转换后的JSON对象
if(obj){return false;
}
else{return true;
}
}
else{return false;
}
}
</script>
<style id="style1" type="text/css">
body
{
background-color: #9ECBE8
}
</style>
</head>
<body>
<form id="form1" runat="server">
<table width="100%">
<tr>
<td style="width: 25%">
</td>
<td align="center" style="font-size: larger; font-weight: bold">
<asp:Label ID="lbltitle" runat="server"></asp:Label>
</td>
<td style="width: 25%">
</td>
</tr>
<tr>
<td style="width: 25%">
</td>
<td align="left" class="">
<asp:Label ID="lbldescr" runat="server"></asp:Label>
</td>
<td style="width: 25%">
</td>
</tr>
<tr>
<td style="width: 25%">
</td>
<td>
<hr style="border: 1px dotted #036" />
</td>
<td style="width: 25%">
</td>
</tr>
<tr>
<td style="width: 25%">
</td>
<td align="left">
<asp:Panel ID="Panel1" runat="server">
</asp:Panel>
</td>
<td style="width: 25%">
</td>
</tr>
<tr>
<td style="width: 25%">
</td>
<td>
<hr style="border: 1px dotted #036" />
</td>
<td style="width: 25%">
</td>
</tr>
<tr>
<td style="width: 25%">
</td>
<td align="left">
<input type="button" value="提交" onclick="Insert()" />
<input type="button" value="重置" onclick="javascript:location.reload()" />
</td>
<td style="width: 25%">
</td>
</tr>
</table>
</form>
</body>
</html>
WebService代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Data.SqlClient;
using System.Data; namespace QuestionnaireSurveySystem.Server
{
/// <summary>
/// NaireService 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
[System.Web.Script.Services.ScriptService]
public class NaireService : System.Web.Services.WebService
{ //[WebMethod]
//public string HelloWorld()
//{
// return "Hello World";
//}
private string constr = ConfigHelper.GetConfigString("System.ConnectionString");
/// <summary>
/// 判断用户是否有进行问卷
/// </summary>
/// <param name="uid"></param>
/// <param name="nid"></param>
/// <returns></returns>
[WebMethod(Description = "判断用户是否有进行问卷")]
public bool IsHasCarry(string uid, string nid)
{
SqlConnection con = new SqlConnection(constr);
con.Open();
DataTable dt = new DataTable();
SqlDataAdapter sda = new SqlDataAdapter("SELECT ID FROM Q_Answer WHERE Uid=" + uid + " AND Nid=" + nid + "", con);
sda.Fill(dt);
con.Close();
if (dt.Rows.Count > )
{
return true;
}
else
{
return false;
}
} /// <summary>
/// 将问卷调查的结果写入数据库
/// </summary>
/// <param name="uid">用户编号</param>
/// <param name="nid">项目编号</param>
/// <param name="val">结果字符串</param>
/// <returns></returns>
[WebMethod(Description = "将问卷调查的结果写入数据库")]
public int RecordResult(string uid, string nid, string val)
{
SqlConnection con = new SqlConnection(constr);
con.Open();
SqlCommand cmd = new SqlCommand("exec sp_NaireAnswer " + uid + "," + nid + ",'" + val + "'", con);
int i = cmd.ExecuteNonQuery();
con.Close();
return i; }
}
}
结束语:
时间关系,只是作了简单的问卷展示页面,其他维护性页面都没有做。直接在后台数据库处理的。有兴趣的朋友可以完善下。写的很粗糙,欢迎大神拍砖。
补一张效果图
转载请说明出处 http://www.cnblogs.com/hhwan/p/4108358.html
简单版问卷调查系统(Asp.Net+SqlServer2008)的更多相关文章
- 下载文件时-修改文件名字 Redis在Windows中安装方法 SVN安装和使用(简单版) WinForm-SQL查询避免UI卡死 Asp.Net MVC Https设置
下载文件时-修改文件名字 1后台代码 /// <summary> /// 文件下载2 /// </summary> /// <param name="Fil ...
- 一个简单的CS系统打包过程图文版
一个简单的CS系统打包过程图文版 1. 打包内容 1.1. 此次打包的要求和特点 主工程是一个CS系统: 此CS系统运行的先决条件是要有.Net Framework 3.5: 主工程安装完成 ...
- 【小型系统】简单的刷票系统(突破IP限制进行投票)
一.前言 相信大家平时肯定会收到朋友发来的链接,打开一看,哦,需要投票.投完票后弹出一个页面(恭喜您,您已经投票成功),再次点击的时候发现,啊哈,您的IP(***.***.***.***)已经投过票了 ...
- 简单的刷票系统(突破IP限制进行投票) (转)
前言 相信大家平时肯定会收到朋友发来的链接,打开一看,哦,需要投票.投完票后弹出一个页面(恭喜您,您已经投票成功),再次点击的时候发现,啊哈,您的IP(***.***.***.***)已经投过票了,不 ...
- SLAM+语音机器人DIY系列:(一)Linux基础——2.安装Linux发行版ubuntu系统
摘要 由于机器人SLAM.自动导航.语音交互这一系列算法都在机器人操作系统ROS中有很好的支持,所以后续的章节中都会使用ROS来组织构建代码:而ROS又是安装在Linux发行版ubuntu系统之上的, ...
- 第三周 构造一个简单的Linux系统MenuOS
一. Linux内核源代码简介 稳定版内核:Linux-3.18.6 Linux内核源代码的目录结构: arch目录:在Linux内核源代码里占有的比重很大,因为Linux内核支持很多的体系结构, ...
- 关于Unity中旧版动画系统的使用
Unity在5.X以后,有一个旧版的动画系统和新版的动画系统. 新版的动画系统是使用Unity动画编辑器来调的,调动画和控制动画 旧版的动画系统是用其他的第三方软件调好后导出到一个FBX文件里面,就是 ...
- 拦截导弹简单版(读入一串整数时getline(cin,s) stringstream is(s);)
拦截导弹简单版 时间限制: 1 Sec 内存限制: 128 MB提交: 40 解决: 16[提交][状态][讨论版][命题人:外部导入] 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系 ...
- 动手写一个简单版的谷歌TPU-指令集
系列目录 谷歌TPU概述和简化 基本单元-矩阵乘法阵列 基本单元-归一化和池化(待发布) TPU中的指令集 SimpleTPU实例: (计划中) 拓展 TPU的边界(规划中) 重新审视深度神经网络中的 ...
随机推荐
- javascirpt历史澄清误解基本概念特点编程语言web2.0网页javascript - javascirpt知识大全
目录1历史 2澄清误解 3基本概念 4特点 5与Java的不同 6开发工具 历史 大概在1992年,一家称作Nombas的公司开始开发一种叫做C减减(C-minus-minus,简称Cmm)的嵌入式脚 ...
- Z-偏移量
使用Z-偏移量 在一个三维场景中,我们可以对共面的多边形使用z-偏移量来使它们不再共面.这项技术通常用于在场景中正确的显示阴影.例如,一堵墙上的阴影与这堵墙的深度值是相同的,如果我们先渲染了墙再来渲染 ...
- 【Todo】各种排序整理
今天面试别人,问到堆排序.发现自己都记不太清楚了. 堆排序 从小到大排序,要用到的是,最大堆. 过程是最大堆,堆顶的最大的元素,调换到数组最后,依次进行.最后达到从小到大的效果. 归并排序 可以看这个 ...
- EntityFramework:支持同一事务提交的批量删除数据实现思路
一切从一段代码说起... 下面一段代码是最近我在对一EF项目进行重构时发现的. protected override void DoRemove(T entity) { this.dbContext. ...
- POJ 2828 (线段树 单点更新) Buy Tickets
倒着插,倒着插,这道题是倒着插! 想一下如果 Posi 里面有若干个0,那么排在最前面的一定是最后一个0. 从后往前看,对于第i个数,就应该插在第Posi + 1个空位上,所以用线段树来维护区间空位的 ...
- BZOJ 4557 侦查守卫
好迷的树形dp... #include<iostream> #include<cstdio> #include<cstring> #include<algor ...
- android studio 加载第三方类库
以引入Xutil包为例 1. 将Xutil包导入到module的libs目录下 2. File->project structure 还有一种方法是在libs目录下右键点击Add as libr ...
- Write operations are not allowed in read-only mode错误
(转+作者个人理解) 最近在配置 Structs, Spring 和Hibernate整合的问题: 开启OpenSessionInViewFilter来阻止延迟加载的错误的时候抛出了这个异常: org ...
- 【自动化测试】Selenium处理富文本框
http://blog.csdn.net/fudax/article/details/8089404 selenium处理富文本框,日历控件等 调用JS修改value值 document.getEle ...
- greensock的tween源码阅读笔记
对于一个处于gc状态的tween,如果这个gc状态是由kill触发的,那么直接从masterList删除否则的话,被tweenlite的垃圾回收删除! 对于一个不是立即启动的tween,它被添加到ti ...