基于.NET平台的Windows编程实战(七)—— 问卷统计功能的实现

原创|其它|编辑:郝浩|2009-06-08 10:36:55.000|阅读 783 次

概述:本系列课程是专为新手们写来入门练习用的,目的是想通过一个完整的问卷调查管理系统的案例来让新手们了解、加深或是熟悉项目的开发流程及在.NET平台上使用VS2005和C# 进行Windows方面的编程;在整个课程的设计上,我尽量避开或是根本不讨论底层的以及性能优化等方面的东西,故高手完全可以无视本系列课程。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

申明:本系列课程是专为新手们写来入门练习用的,目的是想通过一个完整的问卷调查管理系统的案例来让新手们了解、加深或是熟悉项目的开发流程及在.NET平台上使用VS2005C# 进行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(1020);//设置选项的位置
                            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();//关闭当前窗口
            }

        }

分析:从上面的代码中,我们可以看出,我们先将题目读出来存放到GroupBox[一条题目对应一个GroupBox],读出题目的过程中,我们进行了单选与多选题的判断,
并对相应的选项进行了RadioButtonCheckBox的绑定,以便用户进行点击选择;之后,我们再将这些GroupBox添加到一个Panel里面并展示出来,这样当工作人员选择
相应题目的选项,并点击“添加”按钮后,再循环筛选出每一个GroupBox中选中的题目选项,并进行其选项对应的Result_Count即可实现统计的累加了,其实现代码如下所示:

/// <summary>
        
/// 添加问卷统计
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void AddStatBtn_Click(object sender, EventArgs e)
        
{
            
try
            
{//捕获异常
                int grbi = SvTitleFPanel.Controls.Count;//获取SvTitleFPanel中所包含的GroupBox数
                int ci = 0;//用来统计GroupBox中的控件数,如RadioButton等
                GroupBox gbox;//定义GroupBox,用来存放该题目标题及其对应的选项
                RadioButton rdiobtn;//定义RadioButton,用来放在单选题选项前
                CheckBox cbox;//定义CheckBox,用来放在多选题选项前
                string addReSql = "";
                
int rei = 0;//用来判断是否更新了统计数
                for (int gbi = 0; gbi < grbi; gbi++//循环所有存放题目的GroupBox控件
                {
                    ci 
= SvTitleFPanel.Controls[gbi].Controls.Count;//GroupBox中的控件数
                    gbox = (GroupBox)SvTitleFPanel.Controls[gbi];//获取存放题目的GroupBox
                    if (gbox.Tag.ToString() == "0"//从GroupBox中获取题目类型,并进行判断,0为单选题,1为多选题
                    {
                        
for (int cii = 0; cii < ci; cii++//循环存放每一条题目选项的RadioButton
                        {
                            rdiobtn 
= (RadioButton)gbox.Controls[cii];//获取存放选项的RadioButton
                            if (rdiobtn.Checked) //如果用户选择了,则更新相应选项的选数
                            {
                                addReSql 
= "Update Lj_Result Set Result_Count=Result_Count+1 Where id=" + Convert.ToInt32(rdiobtn.Tag);

                                
if (dboperate.ExcuteIntSql(addReSql) > 0)//执行更新选项
                                {
                                    rei
++;//如果更新成功,则加1
                                }

                            }

                        }

                    }

                    
else
                    
{  //如果为多选,则执行如下操作,注释同上面的单选差不多,不多写了
                        for (int cbi = 0; cbi < ci; cbi++)
                        
{
                            cbox 
= (CheckBox)gbox.Controls[cbi];
                            
if (cbox.Checked)
                            
{
                                addReSql 
= "Update Lj_Result Set Result_Count=Result_Count+1 Where id=" + Convert.ToInt32(cbox.Tag);

                                
if (dboperate.ExcuteIntSql(addReSql) > 0)//执行更新选项
                                {
                                    rei
++;//如果更新成功,则加1
                                }

                            }

                        }

                    }

                }

                
if (rei > 1//如果大于1,则表示执行了更新,则执行如下操作
                {                    
                    
string surOuntSql = "Update Lj_Survey Set Survey_Count=Survey_Count+1 Where id=" + Convert.ToInt32(surveyId);
                    dboperate.ExcuteSql(surOuntSql);
//更新统计的问卷份数

                    
string sql = "Select Survey_Count From Lj_Survey Where id=" + Convert.ToInt32(surveyId);
                    
string surveyAllCount = dboperate.ExcuteStrScrSql(sql);//获取统计的份数
                    if (MessageBox.Show("添加统计成功!请刷新相应列表!目前共统计了 " + surveyAllCount + " 份,是否继续统计?""操作提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
                    
{
                        SvTitleFPanel.Controls.Clear();
//清空选择记录
                        BindData(surveyId);//重新绑定问卷题目及选项
                    }

                    
else
                    
{
                        
this.Close();//关闭当前窗口
                    }

                }

            }

            
catch (Exception)  //如出现异常,则提示,并关闭窗口
            {
                MessageBox.Show(
"添加统计失败!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                
this.Close();//关闭当前窗口
            }


        }
2. 合并统计的实现
                            图7-2
从上面的图中,想必大家已经猜到了问卷的合并方法了吧,是的,我们是通过从外部导入数据的方法来进行合并的,其设计的原型是这样来的:比如我们有20份收回来的问卷,
分别由
A某和B2个工作人员进行统计,各统计10份,B某统计好了后,将其统计的数据库导出来并COPY给了A某,A某拿到B某的的数据库后,就可以通过上图7-2中的“浏览”
查找到
B某的数据库,并选择需要合并统计的问卷后,点“确定合并”,系统便可自行进行合并统计了。其实现的代码如下所示: 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms; 
using System.IO;//引入文件操作类库

namespace LJ_QuestionnaireSystem
{
    
/// <summary>
    
/// Name:合并问卷统计类
    
/// Author:Asidy
    
/// Time:2009.04.26gtf
    
/// </summary>

    public partial class SurveyStUnite : SurveryWin
    
{
        
public SurveyStUnite()
        
{
            InitializeComponent();
        }

        
//初始化问卷列表:将问卷绑定到SurveyComBox控件上
        private void SurveyStUnite_Load(object sender, EventArgs e)
        
{
            
string sql = "Select id,Survey_Name From Lj_Survey";//查询问卷列表
            DataTable sdt = dboperate.GetDataTable(sql);//得到查询出的问卷数据表
            if (sdt.Rows.Count > 0)   //如果问卷存在则进行如下操作
            
                SurveyComBox.DataSource 
= sdt; //设置SurveyComBox的数据源为sdt
                SurveyComBox.DisplayMember = "Survey_Name"//将问卷名绑定到SurveyComBox列表项的显示属性上,用来显示问卷名
                SurveyComBox.ValueMember = "id"//将问卷的ID值绑定到SurveyComBox列表项的实际值属性上,以便操作时获取其ID值进行查询
            }

        }

        
/// <summary>
        
/// 查找合并统计的数据库文件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void FindFolderBt_Click(object sender, EventArgs e)
        
{
            OpenFileDialog opf 
= new OpenFileDialog();//实例化一个打开对话框对象
            opf.Filter = "Access数据库文件(*.mdb)|*.mdb";//设置文件类型
            opf.Title = "选择合并的数据库";//设置对话框标题
            opf.RestoreDirectory = true;//对话框关闭还原到当前目录
            if (opf.ShowDialog() == DialogResult.OK) //如果对话框返回OK,则执行如下操作
            {
                StatDbFileTxt.Text 
= opf.FileName; //将查找合并的数据库文件名赋值给StatDbFileTxt控件             
            }


            opf.Dispose();
//释放对话框所使用的资源
        }

        
/// <summary>
        
/// StatDbFileTxt中的内容改变时引发此事件
        
/// 即当用户输入或选择合并的数据库时引发此事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void StatDbFileTxt_TextChanged(object sender, EventArgs e)
        
{
            
if (StatDbFileTxt.Text.Trim() != ""//如果StatDbFileTxt中的内容不为空时,执行如下操作,否则弹出提示对话框
            {
                SureUniteBtn.Enabled 
= true;//将"确定合并"按钮设置为可操作状态   
                CancelBtn.Enabled = true;
                
try  
                
//捕获异常
                    if (StatDbFileTxt.Text.Trim().Substring(StatDbFileTxt.Text.LastIndexOf('.')) != ".mdb")
                    
{//如果用户输入或选择的数据库文件不是以.mdb为扩展名的文件,则弹出提示对话框,并将"确定合并"按钮设置为不可操作状态
                        MessageBox.Show("请输入或选择正确的数据库路径!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        SureUniteBtn.Enabled 
= false;//将"确定合并"按钮设置为不可操作状态
                    }

                    
else  
                    
{
                        SureUniteBtn.Enabled 
= true;//将"确定合并"按钮设置为可操作状态
                        string dbpath = @"..\..\DataBase\1.mdb"//定义数据库缓存名及路径,用来缓存合并的数据库.注意:发布是设为:@"DataBase\1.mdb"
                        try
                        
{//捕获异常
                            File.Copy(StatDbFileTxt.Text.Trim(), dbpath, true);//将用户输入或选择合并统计的数据库缓存到dbpath设置的路径中
                        }

                        
catch (FileNotFoundException)
                        
{//如果没有找到用户输入或选择合并统计的数据库,则弹出提示对话框,并将"确定合并"按钮设置为不可操作状态
                            MessageBox.Show("请输入或选择正确的数据库路径!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            SureUniteBtn.Enabled 
= false;//将"确定合并"按钮设置为不可操作状态
                        }

                        
catch (Exception)
                        
{//如果引发其它异常,则弹出提示对话框,并将"确定合并"按钮设置为不可操作状态
                            MessageBox.Show("导入合并的数据库缓存出错!可能是系统盘空间不够或系统的安装目录访问权限不够,建议将系统安装到非系统盘(即操作系统安装盘以外的其它盘)再试试!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            SureUniteBtn.Enabled 
= false;//将"确定合并"按钮设置为不可操作状态
                        }

                    }

                }

                
catch(Exception)
                
{//如果引发其它异常,则弹出提示对话框,并将"确定合并"按钮设置为不可操作状态
                    MessageBox.Show("请输入或选择正确的数据库路径!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    SureUniteBtn.Enabled 
= false;//将"确定合并"按钮设置为不可操作状态
                }

            }

        }

        
        DbOperate dboperate 
= new DbOperate();//实例化一个数据库操作对象,用来操作数据库
        /// <summary>
        
/// 当用户点击"确定合并"按钮时引发此事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void SureUniteBtn_Click(object sender, EventArgs e)
        
{
            
if (AllStatChBox.Checked)  //如果选择了"全部合并",则执行如下操作
            {
                DataTable surveydt 
= dboperate.GetTable("Select id From Lj_Survey"); //获取用户选择导入合并统计的数据库中的对应问卷数据表
                if (surveydt.Rows.Count > 0)  //如果存在问卷,则执行如下操作
                {
                    SureUniteBtn.Text 
= "正在合并……";
                    SureUniteBtn.Enabled 
= false;
                    CancelBtn.Enabled 
= false;
                    
string rSql = "", upSql = ""//分别定义二个字符串,用来存放SQL语句
                    DataTable rdt;//定义一个数据表,用来存放相应问卷下的题目选项
                    int jjj = 0;//用来判断是否合并成功
                    for (int si = 0; si < surveydt.Rows.Count; si++//循环查询每一个问卷
                    {
                        
//将用户导入合并统计的数据库中对应问卷下题目的选项查询语句存入rSql中
                        rSql = "Select Result_Sid,Result_Tid,Result_Content,Result_Count From Lj_Result Where Result_Sid=" + Convert.ToInt32(surveydt.Rows[si][0]);
                        rdt 
= dboperate.GetTable(rSql);//获取用户选择导入合并统计的数据库中的对应问卷下题目的选项数据表
                        int jj = 0//用来判断是否执行了合并操作                       
                        if (rdt.Rows.Count > 0//如果存在此选项数据表,则执行如下操作
                        {
                            proBar.Visible 
= true//将进度条设为可见
                            proBar.Minimum = 0//设置进度条的起始值为0
                            proBar.Maximum = rdt.Rows.Count; //设置进度条的最大值为选项数据表的总行数                     
                            for (int ii = 0; ii < rdt.Rows.Count; ii++//将每一条对应的数据进行合并更新到现有数据库中
                            
                                
//将现有数据库中对应项的更新语句存入upSql中
                                upSql = "Update Lj_Result Set Result_Count=Result_Count+" + Convert.ToInt32(rdt.Rows[ii][3]) + " Where Result_Sid=" + Convert.ToInt32(rdt.Rows[ii][0]) + " and Result_Tid=" + Convert.ToInt32(rdt.Rows[ii][1]) + " and Result_Content='" + rdt.Rows[ii][2].ToString() + "'";
                                
if (dboperate.ExcuteIntSql(upSql) > 0)
                                
{
                                    jj
++;//如果更新成功,则加1
                                }

                                proBar.Value 
= ii + 1//进度条的当前值也加1
                            }

                            
if (jj > 0//如果更新成功,则执行如下操作:继续更新对应问卷的统计份数
                            {
                                
//获得用户导入合并统计的数据库中对应问卷的统计份数
                                int surveyCount = dboperate.ExcueteIntSql("Select Survey_Count From Lj_Survey Where id=" + Convert.ToInt32(surveydt.Rows[si][0]));
                                
//将现有数据库中对应问卷的统计份数加上导入合并统计数据库中对应问卷的统计份数,并执行更新操作
                                string sSql = "Update Lj_Survey Set Survey_Count=Survey_Count+" + surveyCount + " Where id=" + Convert.ToInt32(surveydt.Rows[si][0]);
                                dboperate.ExcuteSql(sSql); 
//执行更新操作
                            }

                        }

                        jjj 
= jjj + jj;//将判断合并成功与否的数据加上更新的条数,用来判断是否更新成功
                    }

                    
if (jjj > 0//如果大于0,则表示更新成功,执行如下操作;否则弹出合并失败提示对话框
                    {
                        SureUniteBtn.Text 
= "合并成功";
                        CancelBtn.Enabled 
= true;
                        MessageBox.Show(
"合并成功,请刷新相应列表!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        
try
                        
{//捕获删除异常
                            File.Delete(@"..\..\DataBase\1.mdb");//删除合并的缓存数据库.注意:发布是设为:@"DataBase\1.mdb"
                        }

                        
catch (Exception) //如果出现异常,则跳过
                        {
                        }

                        
this.Close();//关闭当前窗口
                    }

                    
else
                    
{
                        SureUniteBtn.Text 
= "合并失败";
                        CancelBtn.Enabled 
= true;
                        MessageBox.Show(
"合并失败,请检查导入合并的数据库是否正确!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }

                }

                
else
                
{   //如果不存在问卷,则弹出提示对话框
                    SureUniteBtn.Text = "确定合并";
                    SureUniteBtn.Enabled 
= true;
                    CancelBtn.Enabled 
= true;
                    MessageBox.Show(
"导入合并的数据库中没有问卷!请检查导入合并的数据库!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    
//this.Close();
                }

            }

            
else
            
{   //如果没有选择"全部合并",则执行如下操作
                int surveyId = Convert.ToInt32(SurveyComBox.SelectedValue); //获取当前选择合并的问卷ID
                if (StatDbFileTxt.Text.Trim() != "")//如果用户输入或选择导入合并统计的数据库不为空,则执行如下操作;否则弹出提示框
                {
                    
//将用户导入合并统计的数据库中对应问卷下题目的选项查询语句存入sql中
                    string sql = "Select Result_Sid,Result_Tid,Result_Content,Result_Count From Lj_Result Where Result_Sid=" + surveyId;
                    DataTable dt 
= dboperate.GetTable(sql);//获取用户选择导入合并统计的数据库中的对应问卷下题目的选项数据表

                    
if (dt.Rows.Count > 0//如果此选项数据表不为空,则执行如下操作;否则弹出提示框
                    {
                        SureUniteBtn.Text 
= "正在合并……";
                        SureUniteBtn.Enabled 
= false;
                        CancelBtn.Enabled 
= false;
                        
string tSql = "";
                        
int j = 0;//用来判断是否执行了更新操作
                        proBar.Visible = true//将进度条设为可见
                        proBar.Minimum = 0;//将进度条的起始值设为0
                        int cout = dt.Rows.Count;//选项数据表的总行数
                        proBar.Maximum = cout;//设置进度条的最大值为选项数据表的总行数                        
                        for (int i = 0; i < cout; i++//将每一条对应的数据进行合并更新到现有数据库中
                        {
                            
//将现有数据库中对应项的更新语句存入upSql中
                            tSql = "Update Lj_Result Set Result_Count=Result_Count+" + Convert.ToInt32(dt.Rows[i][3]) + " Where Result_Sid=" + Convert.ToInt32(dt.Rows[i][0]) + " and Result_Tid=" + Convert.ToInt32(dt.Rows[i][1]) + " and Result_Content='" + dt.Rows[i][2].ToString() + "'";
                            
if (dboperate.ExcuteIntSql(tSql) > 0)
                            
{
                                j
++;//如果更新成功,则加1
                            }

                            proBar.Value 
= i + 1//进度条的当前值也加1
                        }

                        
if (j > 0//如果更新成功,则执行如下操作:继续更新对应问卷的统计份数;否则弹出合并失败提示对话框
                        {
                            SureUniteBtn.Text 
= "合并成功";
                            CancelBtn.Enabled 
= true;
                            
//获得用户导入合并统计的数据库中对应问卷的统计份数
                            int surveyCount = dboperate.ExcueteIntSql("Select Survey_Count From Lj_Survey Where id=" + surveyId);
                            
//将现有数据库中对应问卷的统计份数加上导入合并统计数据库中对应问卷的统计份数,并执行更新操作
                            string sSql = "Update Lj_Survey Set Survey_Count=Survey_Count+" + surveyCount + " Where id=" + surveyId;
                            dboperate.ExcuteSql(sSql);
//执行更新操作
                            MessageBox.Show("合并成功,请刷新相应列表!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            
try
                            
//捕获删除异常
                                File.Delete(@"..\..\DataBase\1.mdb");//删除合并的缓存数据库.注意:发布是设为:@"DataBase\1.mdb"
                            }

                            
catch (Exception) //如果出现异常,则跳过
                            {
                            }

                            
this.Close();//关闭当前窗口
                        }

                        
else
                        
{
                            SureUniteBtn.Text 
= "合并失败";
                            CancelBtn.Enabled 
= true;
                            MessageBox.Show(
"合并失败,请检查导入合并的数据库是否正确!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information); 
                        }

                    }

                    
else
                    
{
                        SureUniteBtn.Text 
= "确定合并";
                        SureUniteBtn.Enabled 
= true;
                        CancelBtn.Enabled 
= true;
                        MessageBox.Show(
"没有找到相对应的问卷,请检查导入合并的数据库中是否包含有相对应的问卷!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        
//this.Close();
                    }

                }

                
else
                
{
                    SureUniteBtn.Text 
= "确定合并";
                    SureUniteBtn.Enabled 
= true;
                    CancelBtn.Enabled 
= true;
                    MessageBox.Show(
"请输入或选择要导入合并的数据库路径!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }

            }

        }

        
/// <summary>
        
/// 当用户点击"全部合并"选项时引发此事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void AllStatChBox_CheckedChanged(object sender, EventArgs e)
        
{
            
//如果点选了"全部合并",则不可再选择问卷;反之,则可
            if (AllStatChBox.Checked)
            
{
                SurveyComBox.Enabled 
= false;
            }

            
else
            
{
                SurveyComBox.Enabled 
= true;
            }

        }
        
    }

}

OK,本课程就先到这里,如有其它不清楚或疑惑的地方,请在下面留言说明,我将尽全力给予解答,希望能给大家带来一点帮助!谢谢的大家支持……

附:本课程源码下载


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP