简单版问卷调查系统(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_NaireQ_ProblemQ_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[0]["Title"].ToString();
            lbldescr.Text = dt.Rows[0]["Descr"].ToString();

            int sid = 1;//单选题序号
            int mid = 1;//多选题序号
            int aid = 1;//问答题序号

            if (dt2.Rows.Count > 0)
            {
                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 == 1)
                            {
                                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 + 1;
                            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 == 1)
                            {
                                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 + 1;
                            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(600);
                            txb.Height = Unit.Pixel(50);

                            if (aid == 1)
                            {
                                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 + 1;
                            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 = 0; i < p.length; i++)
              {
                  if (p[i].checked)
                  {
                      v = v + p[i].name.split('$')[0] + "." + p[i].value + ",";
                  }
              }
              var t = document.getElementsByTagName("textarea");
              for (var i = 0; i < t.length; i++)
              {
                  /*处理输入中的"."*/
                  v = v + t[i].id + "." + t[i].value.toString().split('.').join('') + ",";
              }
              v = v.substring(0, v.length - 1);
              return v;
          }

          //判断是否填写完整
          function CheckSelect()
          {
              /*
              在使用indexOf方法前,执行一下下面的js, 
              原理就是如果发现数组没有indexOf方法,会添加上这个方法
              */
              if (!Array.prototype.indexOf)
              {
                  Array.prototype.indexOf = function (elt /*, from*/)
                  {
                      var len = this.length >>> 0;
                      var from = Number(arguments[1]) || 0;
                      from = (from < 0) ? Math.ceil(from) : Math.floor(from);
                      if (from < 0)
                          from += len;
                      for (; from < len; from++)
                      {
                          if (from in this && this[from] === elt)
                              return from;
                      }
                      return -1;
                  };
              }
              /*
              */
              var ok = false;//完成标志
              var no = new Array();//应完成项
              var nn = new Array();//已完成项
              var s = document.getElementsByTagName('input');//选择项
              for (var i = 0; i < s.length; i++)
              {
                  var n = s[i].name.split('$')[0].toString();

                  if (no.indexOf(n) < 0 && s[i].type == "radio")
                  {
                      no.push(n)
                  }
                  if (no.indexOf(n) < 0 && s[i].type == "checkbox")
                  {
                      no.push(n)
                  }
                  if (s[i].checked && nn.indexOf(n) < 0 && s[i].type == "radio")
                  {
                      nn.push(n);
                  }
                  if (s[i].checked && nn.indexOf(n) < 0 && s[i].type == "checkbox")
                  {
                      nn.push(n);
                  }
              }
              var t = document.getElementsByTagName("textarea");
              for (var i = 0; i < t.length; i++)
              {
                  var m = t[i].name.split('$')[0];
                  if (no.indexOf(m) < 0)
                  {
                      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)
                          {
                              //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)
              {
                  //200代表成功
                  var res = xmlhttp.responseXML; //得到WebService传回的结果
                  var strJSON = res.childNodes[1].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=" 25%">
            </td>
            <td align="center" style="font-size: larger; font-weight: bold">
                <asp:Label ID="lbltitle" runat="server"></asp:Label>
            </td>
            <td style=" 25%">
            </td>
        </tr>
        <tr>
            <td style=" 25%">
            </td>
            <td align="left" class="">
                <asp:Label ID="lbldescr" runat="server"></asp:Label>
            </td>
            <td style=" 25%">
            </td>
        </tr>
        <tr>
            <td style=" 25%">
            </td>
            <td>
                <hr style="border: 1px dotted #036" />
            </td>
            <td style=" 25%">
            </td>
        </tr>
        <tr>
            <td style=" 25%">
            </td>
            <td align="left">
                <asp:Panel ID="Panel1" runat="server">
                </asp:Panel>
            </td>
            <td style=" 25%">
            </td>
        </tr>
        <tr>
            <td style=" 25%">
            </td>
            <td>
                <hr style="border: 1px dotted #036" />
            </td>
            <td style=" 25%">
            </td>
        </tr>
        <tr>
            <td style=" 25%">
            </td>
            <td align="left">
                <input type="button" value="提交" onclick="Insert()" />
                <input type="button" value="重置" onclick="javascript:location.reload()" />
            </td>
            <td style=" 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 > 0)
            {
                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

原文地址:https://www.cnblogs.com/hhwan/p/4108358.html