基於.NET平台的Windows編程實戰(七)問卷統計功能的實現(上)

來源:互聯網
上載者:User

本文配套源碼

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.