本文配套源碼
申明:本系列課程是專為新手們寫來入門練習用的,目的是想通過一個完整的問卷調查管理系統的案例來讓新手們了解、加深或是熟悉項目的開發流程及在.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();//關閉當前窗口
}
}