简单版问卷调查系统(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的边界(规划中) 重新审视深度神经网络中的 ...
随机推荐
- 10.10 dos实验
一. 实验目的 (1)认识DOS: (2)掌握命令解释程序的原理: (3)掌握简单的DOS调用方法: (4)掌握C语言编程初步. 二. 实验内容和要求 编写类似于DOS,UNIX的命令行解释程序 (1 ...
- 【Python】如何安装easy_install?
[Python]如何安装easy_install? http://jingyan.baidu.com/article/b907e627e78fe146e7891c25.html easy_instal ...
- XML Schema使用技巧——unique
XML Schema使用技巧——unique XML Scheam允许指定某个元素或属性的值在一定得范围内是唯一的.为了指定元素或属性值的唯一性,可以使用<xs:unqiue>元素,使 ...
- RabbitMQ用户角色及权限控制
RabbitMQ的用户角色分类:none.management.policymaker.monitoring.administrator RabbitMQ各类角色描述:none不能访问 managem ...
- URAL1748. The Most Complex Number
1748 反素数 素数的个数随大小的递增而递减 可以相同 注意各种超啊 #include <iostream> #include<cstdio> #include<cst ...
- HDU 2553 (状压) N皇后问题 (2)
也许大多数做法都是打表,但这里用位运算的思想来解决这个问题,位运算果然强大,Orz 原文地址,感觉讲的很明白了: http://www.cnblogs.com/gj-Acit/archive/2013 ...
- C#多态;父类引用指向子类对象;new和override的区别;new、abstract、virtual、override,sealed关键字区别和使用代码示例;c#类的初始化顺序
关于父类引用指向子类对象 例如: 有以下2个类 public class Father { public int age = 70; public static string name = " ...
- tableView的设置
TableView的设置 1.设置table头部和底部的view // 底部(宽度固定是320) tableView.tableFooterView = footer; // 头部(宽度固定是320) ...
- aspose.word使用简单方法
概念介绍 使用aspose生成word报表步骤: 加载word模板 提供数据源 填充 加载模板 提供了4种重载方法 public Document(); public Document(Stream ...
- 戴维·卡梅伦(David William Donald Cameron)经典语录
戴维·威廉·唐纳德·卡梅伦(英语:David William Donald Cameron,1966年10月9日-),汉化译名为甘民乐.现任英国首相.第一财政大臣.公务员事务部部长和保守党党魁,也是英 ...