基于.NET平台的Windows编程实战(七)问卷统计功能的实现(上)2009-11-23 博客园 Asidy申明:本系列课程是专为新手们写来入门练习用的,目的是想通过一个完整的问卷调查管理系统的案例来让新手们了解、加深或是熟悉项目的开发流程及在.NET平台上使用VS2005和C# 进行Windows方面的编程;在整个课程的设计上,我尽量避开或是根本不讨论底层的以及性能优化等方面的东西,故高手完全可以无视本系列课程。本课将带领大家一起来实现添加统计、查看统计、合并统计、以及清空统计等有关问卷统计方面的功能。一、设计思路这里的设计比较简单,我们直接来看看设计流程图[如下图7-1所示],并简单的解释一下流程,可能大家会更加容易理解些:

图7-2 简单的解释一下:发放问卷,并将其回收回来,打开系统中已经录入的该问卷并一份一份的将问卷中被选择的项在系统里面点击选中后,提交,系统自动对每次提交的问卷进行累加统计,并计算出百分比,之后再导出到EXCEL打印即可!二、相关原理讲解 下面我们来主要来看看问卷统计累加以及合并统计的实现原理。1. 问卷统计累加的实现 先看下面的代码:
DbOperate dboperate = new DbOperate();//实例化一个数据库操作对象,以便对下面数据进行相关的数据库操作
/**//// <summary>
/// 绑定问卷数据
/// </summary>
/// <param name="sid">传入的问卷ID</param>
private void BindData(string sid)
{
//查询问卷信息
string surveySql = "Select Survey_Name,Survey_Sponsor,Survey_OutCount,Survey_Count,Survey_TitleCount,Survey_DateTime From Lj_Survey Where id=" + Convert.ToInt32(sid);
DataTable sdt = dboperate.GetDataTable(surveySql);
if (sdt.Rows.Count > 0) //如果查询出的问卷存在,则执行如下操作
{
SurveyName.Text = sdt.Rows[0][0].ToString();//获取问卷名
SponsorLab.Text = "发起者:" + sdt.Rows[0][1].ToString();//获取发起者
string OutCount = sdt.Rows[0][2].ToString();//获取发放数
string surveyCount = sdt.Rows[0][3].ToString();//获取统计数
if (surveyCount == "0" && OutCount != "0")//如果统计了0份,发放了N份
{
ReClaimLab.Text = "统计率:" + "0.00%";
}
else if (surveyCount == "0" && OutCount == "0")//如果没有发放也没有统计,即都为0份
{
ReClaimLab.Text = "统计率:" + "0.00%";
}
else if (surveyCount != "0" && OutCount == "0")//如果没有发放,但统计了N份
{
ReClaimLab.Text = "统计率:" + Convert.ToInt32(surveyCount) + ".00%";
}
else
{//如果发了N份,也统计了N份
ReClaimLab.Text = "统计率:" + String.Format("{0:N2}", (Convert.ToDouble(surveyCount) / Convert.ToDouble(OutCount) * 100)) + "%";
}
OutCountLab.Text = "发放问卷:" + OutCount + "份";
InCountLab.Text = "统计问卷:" + surveyCount + "份";
TitleCountLab.Text = "共有题目:" + sdt.Rows[0][4].ToString() + "道";//获取题目数
SDatetLab.Text = "发放时间:" + Convert.ToDateTime(sdt.Rows[0][5]).ToLongDateString();//获取发放时间
//查询此问卷下的题目信息
string titleSql = "Select id,title_Content,title_Type From Lj_Title Where title_sid=" + Convert.ToInt32(sid);
titleSql += " Order By title_order asc";
DataTable tdt = dboperate.GetDataTable(titleSql);//获取题目数据表
if (tdt.Rows.Count > 0) //如果此问卷存在题目,则执行如下操作
{
DataTable rdt;//定义数据表,用来存放对应题目的选项
string resultSql = "";//用来存放查询对应题目选项的SQL语句
string titype = "";//题目类型
int point = 0;//用于设置题目选项的位置及高度
GroupBox[] tgroup = new GroupBox[tdt.Rows.Count];//定义一个GroupBox控件数组,用来给存放题目标题及题目的选项
for (int ti = 0; ti < tdt.Rows.Count; ti++) //循环每一条题目
{
titype = tdt.Rows[ti][2].ToString();//获取该条题目的类型
tgroup[ti] = new GroupBox(); //实例化GroupBox,用来存放该题目标题及其对应的选项
//tgroup[ti].AutoSize = true;
//tgroup[ti].Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
tgroup[ti].Width = SvTitleFPanel.Width - 40;//设置该题目的高度
tgroup[ti].Cursor = Cursors.Hand;//设置鼠标放上去时的光标形状
tgroup[ti].Text = (ti + 1).ToString() + "." + tdt.Rows[ti][1].ToString();//获取该题目标题
//查询该题目下的选项内容
resultSql = "Select id,result_content From Lj_Result Where Result_tid=" + Convert.ToInt32(tdt.Rows[ti][0].ToString());
rdt = dboperate.GetDataTable(resultSql);//获取选项数据表
if (rdt.Rows.Count == 0) //如果不存在选项,则执行如下操作
{
Label lb = new Label();//用来存放选项内容
lb.AutoSize = true;
lb.Text = "暂无选项";//设置选项内容
lb.Location = new Point(10, 20);//设置选项的位置
tgroup[ti].Controls.Add(lb);//将选项添加到对应的该题目下
}
else //如果存在选项,则执行如下操作
{
if (titype == "0") //判断题目类型,0为单选题
{
RadioButton[] rdioBtn = new RadioButton[rdt.Rows.Count];//定义一RadioButton数组,用来存放所有选项内容
point = 20;
for (int ri = 0; ri < rdt.Rows.Count; ri++) //循环出该题目下的所有选项
{
rdioBtn[ri] = new RadioButton();//实例化一RadioButton,用来存放单个选项内容
rdioBtn[ri].Location = new Point(10, point);//设置选项存放的位置
rdioBtn[ri].Tag = rdt.Rows[ri][0].ToString();//将选项ID设置为选项的Tag标签,用来作统计时选项区别用
rdioBtn[ri].Text = rdt.Rows[ri][1].ToString();//设置选项显示的内容
rdioBtn[ri].AutoSize = true;//自动设置大小
point = point + 20;//高度加20
}
tgroup[ti].Height = point;//设置该题目的高度
tgroup[ti].Tag = titype;//将该题目的类型设置为存放该题目的GroupBox的Tag标签,用来作统计时的题目类型区别用
tgroup[ti].Controls.AddRange(rdioBtn);//将这些选项全添加到该题目中去
}
else //多选 注释同上面的差不多,不再多写
{
CheckBox[] cbox = new CheckBox[rdt.Rows.Count];
point = 20;
for (int ci = 0; ci < rdt.Rows.Count; ci++)
{
cbox[ci] = new CheckBox();
cbox[ci].Location = new Point(10, point);
cbox[ci].Tag = rdt.Rows[ci][0].ToString();
cbox[ci].Text = rdt.Rows[ci][1].ToString();
cbox[ci].AutoSize = true;
point = point + 20;
}
tgroup[ti].Height = point;
tgroup[ti].Tag = titype;
tgroup[ti].Controls.AddRange(cbox);
}
}
}
SvTitleFPanel.Controls.AddRange(tgroup);//将所有的题目添加到SvTitleFPanel中去,进行显示
}
}
else
{ //如果不存在问卷,则提示
MessageBox.Show("不存在本问卷,或许已被删除,请点击上面的[刷新]按钮刷新一下列表!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();//关闭当前窗口
}
}