艾伟:基于.NET平台的Windows编程实战(五)—— 问卷管理功能的实现

简介: 本系列文章导航基于.NET平台的Windows编程实战(一)——前言基于.NET平台的Windows编程实战(二)—— 需求分析与数据库设计基于.NET平台的Windows编程实战(四)—— 数据库操作类的编写基于.

本系列文章导航

基于.NET平台的Windows编程实战(一)——前言

基于.NET平台的Windows编程实战(二)—— 需求分析与数据库设计

基于.NET平台的Windows编程实战(四)—— 数据库操作类的编写

基于.NET平台的Windows编程实战(五)—— 问卷管理功能的实现

基于.NET平台的Windows编程实战(六)—— 题目管理功能的实现

首先,为了使我们的界面更加便于操作及布局,我们引入第三开源控件DockPanel[当然也可以不引入控件而直接进行开发],你可以从这里:DockPanel控件 下载其编译好的DLL文件,也可以从这里:http://sourceforge.net/projects/dockpanelsuite 进行下载。关于DockPanel控件的相关资料大家可以去http://sourceforge.net/projects/dockpanelsuite 或上网查找相关资料进行了解,本项目系统只是用其来进行界面布局方面的操作,至于其它方面的功能不作研究讨论,有兴趣的朋友可以去http://sourceforge.net/projects/dockpanelsuite 上下载其源码来进行研究。

OK!下载了DockPanel控件后,我们将其(即WeifenLuo.WinFormsUI.Docking.dll文件)COPY到前面创建的QuestionnaireSystem项目中的bin文件夹中,并添加到项目的引用中去,方法如下:右击项目名称或右击“引用”-à“添加引用……”,在弹出的对话框中选择浏览选项卡,并找到刚才COPY到项目中的WeifenLuo.WinFormsUI.Docking.dll文件,点“确定”即可,如下图5-1所示:

图5-1

DockPanel引入成功后,我们便可以将其做为放到工具箱中像其它控件一样使用了,下面我们将其添加到工具箱:在左边工具箱下面的空白处右击-à“选择项”-à在弹出的对话框中点击“浏览”并找到COPY到项目中的WeifenLuo.WinFormsUI.Docking.dll并打开,之后如下图5-2所示,再点击“确定”,即可发现左边的工具箱下面多了个DockPanel控件,这表示添加成功了。

图5-2

打开之前我们创建的主窗口MainFrom,并把刚才添加到工具箱的DockPanel控件拉到其界面的空白处,将其Name属性设为dockPanel,并点击如下图5-3所示的“在父容器中停靠”,使其停靠到父容器中。

图5-3

好!打住!主窗口MainFrom的设置先到这里,后面我们再接着设置。

下面我们先来创建一个母窗口吧,以便之后各窗口继承。方法:右击项目名-à“添加”-àWindows窗体”,在弹出的对话框中进入“SurveryWin”,点“确定”即可,如下图5-4所示:

图5-4

并设置如下属性:

BackColorWhite

Icon:设置成项目文件夹Images中的logo.ico图片

Text:设为空,也可以不设

之后,往窗体中拉入一个ContextMenuStrip控件,将其Name设为” CMenuStrip”,并在其第一个子项目上输入“关闭”,如下图5-5所示:

图5-5

之后,在“关闭”上双击,进入代码编辑器,将其代码改写成如下所示:

Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;//引入第三方开源控件DockPanel类库

namespace LJ_QuestionnaireSystem
{
//将这里的默认继承From改成DockContent,以使其继承于第三方控件的DockContent类
    public partial class SurveryWin : DockContent 
    
{
        
public SurveryWin()
        
{
            InitializeComponent();
        }

/**//// 
        
/// 以便用户右击窗口标题时进行关闭当前窗口
        
/// 
        
/// 
        
/// 

        private void 关闭ToolStripMenuItem_Click(object sender, EventArgs e)
        
{
            
this.Close();//关闭当前窗口
        }

    }

}

 

到这里,母窗口算是创建好了,下面就让我们分别来创建问卷添加、问卷编辑、预览问卷、问卷管理四个窗口,依次命名为SurveyAddSurveyModifySurveyPreviewSurveyManage,(创建方法同上面的母窗口的创建一样,在此以及以后的课程中将不再多说),并都使其继承于SurveyWin母窗口,继承的方法也与上面一样,将对应类后面继承的From改成SurveyWin即可,下面以SurveyAdd窗口为例进行讲解说明:

原来为:

public partial class SurveyAdd :From

现在改成:

public partial class SurveyAdd :SurveryWin

 

之后,往SurveyAdd窗口中拉入相应的控件,并设置成如下图5-6所示,具体的属性设置请下载下面的本课程源码进行查看:

 

图5-6

 

    其对应的代码改成如下所示:

   

Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms; 

namespace LJ_QuestionnaireSystem

    
public partial class SurveyAdd :SurveryWin
    
{
        
public SurveyAdd()
        
{
            InitializeComponent();
            BindDataSurvey();
//绑定问卷列表
        }


        DbOperate dboperate 
= new DbOperate();//实例化一个数据库操作对象,用于操作数据
        /**//// 
        
/// 添加问卷
        
/// 
        
/// 
        
/// 

        private void SAddBtn_Click(object sender, EventArgs e)
        
{
            
string SName = SNameText.Text.Trim();//获取输入的问卷名
            string isExistSv = "Select Count(id) From Lj_Survey Where Survey_Name='" + SName + "'";

            
string SPople = SPopleText.Text.Trim();//获取输入的发起者
            int OutCount = Convert.ToInt32(OutCountTxt.Text.Trim());//获取输入的发放份数 
            DateTime dtime = SDTimePicker.Value;//获取发放时间

            
string sql = "Insert into Lj_Survey (survey_Name,survey_Sponsor,survey_OutCount,survey_DateTime) ";
            sql 
+= " values('" + SName + "','" + SPople + "'," + OutCount + ",'" + dtime.ToShortDateString() + "')";

            
if (SName == "" || SPople == "")//判断是否输入了问卷名及发起者,如果没有,则提示
            {
                MessageBox.Show(
"请输入问卷名称或发起者!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

            
else if (dboperate.ExcuteScrSql(isExistSv) > 0)//判断输入的问卷是否已经存在,如存在,则提示
            {
                
//MessageBox.Show("已存在此问卷,请重新输入问卷名!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                IsExistSLab.Visible = true;
            }

            
else
            
{
                IsExistSLab.Visible 
= false;
                
if (Convert.ToInt32(dboperate.ExcuteIntSql(sql)) > 0//如果执行成功,则提示成功,反之提示失败
                {
                    
if (MessageBox.Show("添加成功!请刷新列表!是否继续添加?""操作提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
                    
{
                        SurveyCancel();
//清空所填数据
                        SListBox.Items.Clear();//清空绑定的问卷项
                        BindDataSurvey();//重新绑定问卷
                    }

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

                }

                
else
                
{
                    MessageBox.Show(
"添加失败!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }

            }

        }


        
private void SCancelBtn_Click(object sender, EventArgs e)
        
{
            SurveyCancel();
//清空所填数据
        }

        
/**//// 
        
/// 绑定问卷列表
        
/// 

        private void BindDataSurvey()
        
{
            
string surveySql = "Select Survey_Name From Lj_Survey";//查询问卷的SQL语句
            DataTable sdt = dboperate.GetDataTable(surveySql);//获取问卷数据表
            if (sdt.Rows.Count > 0//如果问卷存在,则执行如下操作
            {
                Object[] items 
= new object[sdt.Rows.Count];//实例化一个对象数组,用于存放读出的问卷名
                for (int i = 0; i < sdt.Rows.Count; i++//循环读出问卷名
                {
                    items[i] 
= (i + 1+ "." + sdt.Rows[i][0].ToString();
                }

                SListBox.Items.AddRange(items);
//将问卷名绑定到SlistBox控件上
            }

        }

        
/**//// 
        
/// 清空所填数据
        
/// 

        private void SurveyCancel()
        
{
            SNameText.Text 
= "";
            SPopleText.Text 
= "";
            OutCountTxt.Text 
= "0"
        }


        
private void SNameText_MouseLeave(object sender, EventArgs e)
        
{
            
string SName = SNameText.Text.Trim();//获取输入的问卷名
            
//查询输入的问卷名是否已经存在,如果存在,则给出提示
            string isExistSv = "Select Count(id) From Lj_Survey Where Survey_Name='" + SName + "'";
            
if (dboperate.ExcuteScrSql(isExistSv) > 0)
            
{
                
//MessageBox.Show("已存在此问卷,请重新输入问卷名!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                IsExistSLab.Visible = true;
            }

            
else
            
{
                IsExistSLab.Visible 
= false;
            }


        }

 
    }

}

以上的代码在这里就不用再进行讲解了吧,上面的注释已经写的很清楚了^_^

至于其它三个窗口的设置,与上面的大同小异,就不一一列出来了,请大家自行下载下面的本课程源码进行对照设置吧。

 

创建好各窗口后,让我们再回到主窗口MainFrom中来进行相对应的关联设置吧!

先在MianFrom中引入DockPanel,如下所示:

using WeifenLuo.WinFormsUI.Docking;

再分别给主菜单 “问卷”下面的子选项以及工具栏中的:“添加问卷”与“问卷管理” 添加Click事件及ItemClick事件,并写一个用来查找已打开窗口的方法FindDocument(string text),用来判断哪些窗口已经打开了,哪些窗口还没有打开,具体代码如下所示:

 

Code
/**//// 
        
/// 在dockPanel中查找已经打开的窗口
        
/// 
        
/// 传入的窗口标题
        
/// 返回的窗口

        private IDockContent FindDocument(string text)
        
{
            
if (dockPanel.DocumentStyle == DocumentStyle.SystemMdi)
            
{
                
foreach (Form form in MdiChildren)
                    
if (form.Text == text)
                        
return form as IDockContent;

                
return null;
            }

            
else
            
{
                
foreach (IDockContent content in dockPanel.Documents)
                    
if (content.DockHandler.TabText == text)
                        
return content;

                
return null;
            }

        }

        
/**//// 
        
/// 添加问卷
        
/// 
        
/// 
        
/// 

        private void SNTStripMenuItem_Click(object sender, EventArgs e)
        
{
            SurveyAdd sadd 
= new SurveyAdd();
            sadd.ShowDialog();
        }

        
/**//// 
        
/// 问卷管理
        
/// 
        
/// 
        
/// 

        private void SToolStripMenuItem_Click(object sender, EventArgs e)
        
{
         
//判断问卷管理窗口是否已经打开了,如果没有打开,则打开,否则将将焦点移到问卷管理窗口上
            if (FindDocument("问卷管理"== null)
            
{
                SurveyManage sm 
= new SurveyManage();
                sm.Show(dockPanel);
            }

            
else
            
{
                Form f 
= FindDocument("问卷管理"as Form;
                f.Focus();
            }

        }

/**//// 
        
/// 工具菜单
        
/// 
        
/// 
        
/// 

        private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        
{
            
if (e.ClickedItem == SMaTooScriptBtn)
                SToolStripMenuItem_Click(
nullnull); 
            
else if (e.ClickedItem == SAddToolScriptBtn)
                SNTStripMenuItem_Click(
nullnull); 
    }

 

最后,我们修改一下主窗口的Load事件,以便启动系统时能打开问卷管理窗口,代码如下所示:

 

private   void  MainForm_Load( object  sender, EventArgs e)
        
{  
                SurveyManage sm 
= new SurveyManage();
                sm.Show(
this.dockPanel); 
    }

 

附,本课程源码下载

目录
相关文章
|
5月前
|
Unix Shell Windows
Windows PowerShell技巧:使用findstr实现类似grep的功能
显示带有线路编号**: `/N`选项将显示每条结果前面带有其在线路上出现位置编号。
819 7
|
5月前
|
开发框架 安全 .NET
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
.NET Framework是Windows平台的开发框架,包含CLR和FCL,支持多种语言开发桌面、Web应用。常用版本有3.5、4.5.2、4.8.1,系统可同时安装多个版本,确保软件兼容运行。
1096 0
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
|
12月前
|
Shell 网络安全 C#
一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
383 4
|
10月前
|
缓存 开发框架 .NET
一个功能丰富的 .NET 工具库 XiHan.Framework.Utils
XiHan.Framework.Utils 是一个功能全面的 .NET 工具库,包含字符串处理、集合扩展、加密解密、分布式 ID、文件操作、缓存、线程、国际化等模块。设计上注重高内聚、低耦合,适用于各类 .NET 应用开发。支持 AES 加密、树形结构转换、分页过滤、日志输出等功能,提供简单易用的 API。可通过 NuGet 快速安装,源码开放,采用 MIT 协议。
351 56
|
10月前
|
数据采集 自然语言处理 Java
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
本文以反面教材形式,剖析了在使用 Playwright 爬取懂车帝车友圈问答数据时常见的配置错误(如未设置代理、Cookie 和 User-Agent),并提供了 Python、Java 和 .NET 三种语言的修复代码示例。通过错误示例 → 问题剖析 → 修复过程 → 总结教训的完整流程,帮助读者掌握如何正确配置爬虫代理及其它必要参数,避免 IP 封禁和反爬检测,实现高效数据采集与分析。
613 3
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
|
10月前
|
安全 API 数据安全/隐私保护
aipy实战:建设PE文件查杀神器,阻止Windows EXE木马!
本工具为小型木马静态特征查杀工具,专用于检测Windows下的EXE文件是否为可疑木马。核心功能包括:扫描恶意字符串(如keylogger、powershell)、检查熵值异常以判断加密/加壳、揪出可疑API组合(如注册表篡改、网络通信链)以及解析PE头分析编译环境与加壳痕迹。通过提示词实现功能开发,并保存为`aipy_kill_rat.py`文件。测试结果显示,工具成功扫描出426个可疑字符串、超高熵值及恶意API组合,确认目标文件为恶意木马。该工具轻量灵活,适合样本初筛与应急响应,是静态分析的高效利器。
|
区块链 C# Windows
PasteEx:一款.NET开源的Windows快捷粘贴神器
PasteEx:一款.NET开源的Windows快捷粘贴神器
252 17
|
人工智能 数据处理 C#
AI Dev Gallery:微软开源 Windows AI 模型本地运行工具包和示例库,助理开发者快速集成 AI 功能
微软推出的AI Dev Gallery,为Windows开发者提供开源AI工具包和示例库,支持本地运行AI模型,提升开发效率。
887 13
|
Linux API C#
基于 .NET 开发的多功能流媒体管理控制平台
基于 .NET 开发的多功能流媒体管理控制平台
251 9