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

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

本系列文章导航

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

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

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

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

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

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

今天下班回来前查看了下早上放出去的第五课的课程,看到一朋友的评论,说实话当时不好受,想想自己每晚写课程到深夜,竟然被人说成白痴文章!于是带着几分冲动草草的回复之后,便带着疑惑与思考回家了。刚才重新看了下昨晚写的第五课的课程,果真发现了不少“白痴”的地方:概念模糊,思路不明,无整体模型,杂乱无章…… 如此之文章,新手如何看懂?如何练习?……自责、自问、自思之后,我决定改变一下后面课程的写作方式,即先写设计思路[流程图],再动手实验并讲解一些相关的实现原理[挑几个比较有代表性的地方进行讲解],之后再把源码放出来供大家参考练习;这样,我想对新手来说应该会更加容易理解一些吧。当然,在这里要感谢一下那位发表评论的朋友,因为是他(她)提醒了我,并使我重新去思考整个课程的设计,在此我向这位朋友说声:谢谢!同时也希望他(她)以及更多的朋友能在以后的课程中提出更多的建议、指导以及批评 ^_^ 我将万分感谢!你们的支持是我最大的动力!

  本课将带领大家一起来实现题目管理:添加、编辑、查看、删除、存入题库;以及题库管理:添加、编辑、查看、删除、插入到问卷等功能。

  一、设计思路

我们知道:一份问卷是由若干条不同的题目组合而成的,而这些题目又是由用户一条一条添加进去的。那么我们来分析一下:假如需要对A区域做一份问卷调查试题,且这份问卷要求包含100条题目,于是我们通过系统[假设这个系统只具有添加/编辑/删除/预览问卷及添加题目的功能]创建好一份名为“A区域试题”的问卷,并向此问卷里输入添加了100条的题目;几天后,我们发现这份问卷有些地方做的不好,需要进行修改,于是我们为了方便操作,便给系统增加了题目编辑、检查[查看]、排序、删除等题目管理功能;再过了几天后,我们又需要对B区域及C区域各做一份包含100条试题的问卷,于是我们打开原来的系统,并创建了二份名为“B区域试题”与“C区域试题”的问卷,但当我们往里面添加题目的时候,我们发现三份问卷有许多相同或相似的题目,于是我们就会想:如果有一个题库能将这些相同或相似的题目存起来,那么当我们需要创建新的问卷的时候,我们直接从题库里面把题目插入进去不就可以了吗?多方便呀!于是我们就有了建立一个题库来存放题目的想法了,并且这个题目应该具有编辑、查看、插入到问卷、删除等功能……

好,现在我们来设计一下流程图:

 

  图6-1

  简单的解释一下添加试题的过程:

  用户向问卷中添加题目时,先在所要添加的问卷中查找是否已经存在了该题,如果存在了则提示,如果不存在,则去题库中进行查找是否存有该题了,如存在则提示从题库中插入该题,

  否则直接添加进问卷中,并提示是否将该存入到题库中去。

  到这里相信大家应该明白或是大致知道了整个的设计思路了吧!下面我们就来动手做做吧。

  二、动手实验及相关原理讲解

  下面我挑选添加题目、排序以及窗口间的相互关联中的部分设置或代码来进行动手实验及原理的讲解,其余的请大家自行下载本课程源码参考练习。

  首先,我们来创建一个添加题目的窗口(创建方法请参见前面的课程),命名为 “TitleAdd”,并使其继承于“SurveyWin”母窗口,方法为将:

  public partial class TitleAdd :From

改成:

  public partial class TitleAdd :SurveryWin

  并将其设置成如下图6-2所示[具体的属性设置请参见本课程源码]: 

  图6-2

  其次,我们给这个窗口中的输入题目标题文本框添加了一个鼠标离开事件,以便提示用户所输入的题目是否已经存在于本问卷或题库中了。

  其实现原理是这样的:当用户往标题文本框中输入标题后,鼠标离开其文本框时,将用户所输入的标题作为条件在其问卷与题库中进行相似题目的查询,

  如查出则给出相关提示,否则作为新题添加进问卷或题库中。其实现的代码如下所示:

 

           private void TRichTitleText_MouseLeave(object sender, EventArgs e)
{
if (TRichTitleText.Text.Trim() != "")//判断是否为空,如不为空,则执行如下操作
{
//在问卷与题库中分别进行查找,看是否已经存在了?
string stSql = "Select Count(*) From Lj_TitleStorage Where TitleSt_Title like '" + TRichTitleText.Text.Trim() + "'";

string tcontent = TRichTitleText.Text.Trim() + "(" + TCombBtn.SelectedItem.ToString() + ")";
string istSql = "Select Count(*) From Lj_Title Where Title_Content like '" + tcontent + "'";

if (dboperate.ExcuteScrSql(istSql) > 0) //如果已经存在于问卷中了,则执行如下操作
{
IsStorageCoMBox.SelectedIndex
= 1;
IsStorageCoMBox.Enabled
= false;//将是否存入题库设为不可选择
TAddBtn.Enabled = false;//将添加按钮设为不可用
IsStorageLab.Visible = true;//显示提示标签
IsStorageLab.Text = "*该题已在此问卷中存在!请重新输入!";
}
else if (dboperate.ExcuteScrSql(istSql) == 0 && dboperate.ExcuteScrSql(stSql) > 0)//
如果已经存在于题库中了,则执行如下操作
{
IsStorageCoMBox.SelectedIndex
= 1;
IsStorageCoMBox.Enabled
= false;
IsStorageLab.Visible
= true;
IsStorageLab.Text
= "*题库中已经存在该题了!";
LookStLinkLab.Enabled
= true; //将"点击查看"按钮设为可用可见,以便用户点击连接到题
库中题目进行查看或插入操作
LookStLinkLab.Visible = true;
}
else
{
IsStorageCoMBox.SelectedIndex
= 0;
IsStorageCoMBox.Enabled
= true;
TAddBtn.Enabled
= true;
IsStorageLab.Visible
= false;
LookStLinkLab.Enabled
= false;
LookStLinkLab.Visible
= false;
}
}
}

  之后,我们再创建一个添加题目选项的窗口,使其命名为“TitleItemsAdd”,继承于“SurveyWin”母窗口,并设置成如下图6-3所示;

  当我们点击图6-2中的“添加”题目按钮时,将会弹出一个提示框来询问用户是否需要马上给题目添加选项,如果用户选择“是”,则弹出本窗口以供用户添加该题目的选项,

  反之,则返回主窗口。

 

  图6-3

  其添加选项与减少选项实现原理是:当点添加选项时,实例化一个TextBox控件并将其添加到FlowLayoutPanel控件中;
  而当点击减少选项时,则从FlowLayoutPanel控件中将其移除,其对应的代码如下所示:

 

Code
private void TSItemSubBtn_Click(object sender, EventArgs e)
{
int count = TItemContPanel.Controls.Count - 1;
if (count >= 0)
{
TItemContPanel.Controls.RemoveAt(count);
//从FlowLayoutPanel中移除控件
i--;
}
else
{
MessageBox.Show(
"请不要再删了,都删完了!^_^"+i, "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
/**//// <summary>
/// 添加选项
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TSItemAddBtn_Click(object sender, EventArgs e)
{
TextBox textbox
= new TextBox();//实例化一个TextBox控件,并添加到FlowLayoutPanel控件中
textbox.Width = 342;
textbox.Height
= 21;
textbox.Text
= "(" + i.ToString() + ").";
TItemContPanel.Controls.Add(textbox);
i
++;
}

  从上面的代码中,我们可以看出,其实现原理是这样的:当点击“上升”时,先获取DataGridView中的当前点击行的行号,再通过这个行号获得当前行的题目ID,之后再对这个当前行进行是否为首行的判断:如果不是则再通过当前行去获得其上一行的行号及题目ID,最后再将这二行所对应的排序号[Title_Order]进行互换即可,反之,如果为首行则提示其只能做下降操作。而当点击“下降”时的实现原理同“上升”差不多,只不过是通过获取当前点击行及对应的下一行的排序号来进行互换而已。

  最后,我们再将这些窗口与主窗口“MainFrom”关联起来:

  我们先打开“MainForm”窗口,分别给主菜单中“题目”菜单下的各子菜单项添加Click事件,其对应的事件处理代码如下所示:

Code

之后,我们再在工具栏的ItemClicked事件中补上如下代码,以便点击工具栏上的相应按钮时,也能出现相同的效果:

 

  else if (e.ClickedItem == TStorageToolStipBtn)
TSToolStripMenuItem_Click(
null, null); //题库管理
else if (e.ClickedItem == TMaToolScriptBtn)
TMaToolStripMenuItem_Click(
null, null); //题目管理
else if (e.ClickedItem == TAddToolScriptBtn)
TAToolScriptMenuItem_Click(
null, null); //添加题目

 

 

这样,就可以将所有的窗口与主窗口关联起来了,当我们点击“题目管理”时,就会出现如下图6-4所示的界面了:


图6-4

OK!本课程就先到这里吧,其余没有讲解的部分,如有不清楚的地方,可以在下面留言,我将尽力给予解答!谢谢大家的支持……

附:本课程源码下载

目录
相关文章
|
9天前
|
存储 设计模式 编解码
.NET 8.0 通用管理平台,支持模块化、WinForms 和 WPF
【11月更文挑战第5天】本文分析了.NET 8.0 通用管理平台在模块化、WinForms 和 WPF 方面的优势。模块化设计提升了系统的可维护性和可扩展性,提高了代码复用性;WinForms 提供了丰富的控件库和简单易用的开发模式,技术成熟稳定;WPF 支持强大的数据绑定和 MVVM 模式,具备丰富的图形和动画功能,以及灵活的布局系统。
|
28天前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
|
7天前
|
消息中间件 开发框架 .NET
.NET 8 强大功能 IHostedService 与 BackgroundService 实战
【11月更文挑战第7天】本文介绍了 ASP.NET Core 中的 `IHostedService` 和 `BackgroundService` 接口及其用途。`IHostedService` 定义了 `StartAsync` 和 `StopAsync` 方法,用于在应用启动和停止时执行异步操作,适用于资源初始化和清理等任务。`BackgroundService` 是 `IHostedService` 的抽象实现,简化了后台任务的编写,通过 `ExecuteAsync` 方法实现长时间运行的任务逻辑。文章还提供了创建和注册这两个服务的实战步骤,帮助开发者在实际项目中应用这些功能。
|
1月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
90 9
|
1月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
30天前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
|
2月前
|
Linux Android开发 iOS开发
Windows平台RTSP|RTMP播放器如何实现实时录像功能
Windows平台RTSP、RTMP播放器实时录像接口设计,实际上,除了Windows平台,我们Linux、Android、iOS平台也是一样的设计,单纯的录像模块,如果做的全面,也不是一两个接口可以搞定的
|
2月前
|
SQL 关系型数据库 数据库
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
|
3月前
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
57 0
|
3月前
|
API C# Shell
WPF与Windows Shell完美融合:深入解析文件系统操作技巧——从基本文件管理到高级Shell功能调用,全面掌握WPF中的文件处理艺术
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的关键组件,用于构建 Windows 桌面应用程序。WPF 提供了丰富的功能来创建美观且功能强大的用户界面。本文通过问题解答的形式,探讨了如何在 WPF 应用中集成 Windows Shell 功能,并通过具体示例代码展示了文件系统的操作方法,包括列出目录下的所有文件、创建和删除文件、移动和复制文件以及打开文件夹或文件等。
76 0

热门文章

最新文章