《Visual Basic NET 2008从基础到项目实战》课件22 Windows Form开发实例:日程提醒程序.ppt

上传人(卖家):momomo 文档编号:6094216 上传时间:2023-05-27 格式:PPT 页数:47 大小:727KB
下载 相关 举报
《Visual Basic NET 2008从基础到项目实战》课件22 Windows Form开发实例:日程提醒程序.ppt_第1页
第1页 / 共47页
《Visual Basic NET 2008从基础到项目实战》课件22 Windows Form开发实例:日程提醒程序.ppt_第2页
第2页 / 共47页
《Visual Basic NET 2008从基础到项目实战》课件22 Windows Form开发实例:日程提醒程序.ppt_第3页
第3页 / 共47页
《Visual Basic NET 2008从基础到项目实战》课件22 Windows Form开发实例:日程提醒程序.ppt_第4页
第4页 / 共47页
《Visual Basic NET 2008从基础到项目实战》课件22 Windows Form开发实例:日程提醒程序.ppt_第5页
第5页 / 共47页
点击查看更多>>
资源描述

1、本章将带领大家一起完成一个Windows Form的开发实例日程提醒程序的设计与开发。本实例中综合应用了前面讲述的知识,主要采用了Windows窗体和控件技术、菜单与工具栏设计等技术、数据访问ADO.NET技术及数据绑定控件DataGridView等。该系统主要完成事务管理和自动提醒两大功能,支持开机自动运行。事务管理功能支持事务的添加、删除、修改和查询。自动提醒功能支持提醒任务设置,任务到期时会自动提醒。22.1 开发背景22.2 系统分析22.3 系统设计22.4 功能实现22.5 运行结果现代生活,工作节奏快,事务繁杂。很多习惯使用纸质记事本的人发现记事本越来越厚,且不容易查找和管理。随

2、着计算机在办公和日常生活中的使用普及,越来越多的人都倾向于使用计算机、PDA、移动电话等电子设备管理和安排自己的事务和行程,日程提醒程序就应运而生。本章的日程提醒程序源自某集团企业协同办公系统中的一个模块,解决日常办公中的日程安排问题。现在笔者将其剥离出来,利用VB.NET重新加以设计和实现,使其可以独立运行,但项目过程的几个重要环节仍然保留下来,以便读者从软件工程的角度来理解软件开发过程。22.2.1 22.2.1 需求分析需求分析功能需求:根据功能需求分析,任务信息和过期任务信息都需要持久化。从性能考虑,我们将其分别存储在不同表中。开发环境分析运行环境分析可行性分析的目的是对于项目是否可进

3、行以及项目进行过程的各种主要影响因素的评估。从技术、经济、社会与法律和风险方面进行说明。整个程序属于一个规模比较大的企业协同办公系统的子模块,从这个子模块技术构成上来看,其基本操作还是对存在数据库进行添加、删除、查找、编辑等,这在.NET平台上可以使用ADO.NET组件方便地实现。另外,提醒功能用到的计时器、多线程操作等也可以使用Timer类实现。又因为是Windows Form程序,所以可以简化到用Timer控件实现。因为Windows应用程序是运行在客户机本地的,所以可以利用本地PC机高性能的计算能力和存储能力来完成大多数业务处理,这是采用Windows Form程序作为程序客户端的重要原

4、因。除工作流任务外,用户通常都是都是自己定制自己的日程安排,互不影响,从这点上讲,数据完全可以存储在用户本地计算机上,而且数据量不会太大(100000记录)。因此我们采用桌面级数据库Access作为数据库。它经济小巧,又能满足业务需要。整个系统用Visual Studio 2008、VB.NET语言开发,运行在可以免费分发的.NET Framework平台上,所以软件本身不存在法律上的版权争议。当然Visual Studio 2008正式版开发软件是需要微软公司授权的。另外,只要用户拥有本地Office正版使用权,那么可以自由使用Access数据库。用户的需求并不稳定,有可能会将该功能扩展到其

5、他业务中,这需要以书面方式确定本程序功能边界。使用Windows Vista操作系统版本以下的用户(如Windows 2000,Windows XP等)还需要单独安装.NET Framework运行库,这需要培训与指导。系统功能设计、界面设计以及数据库设计,其中系统功能设计主要是根据业务处理功能来决定系统的模块结构,而数据库设计与程序运行的效率有着密切的关系。采用软件工程中的原型法,即通过形象具体的界面来引导甲乙双方的需求理解。原型中的界面并不包括逻辑代码,即并不包括核心的业务实现代码。任务信息表代码名称类型说明IDID文本主键title标题文本任务的标题cycle周期文本0表示一次性提醒be

6、gintime开始时间日期/时间任务开始的日期和时间22.4.1 22.4.1 任务管理任务管理程序文件包括:任务列表窗体(MainForm.vb)实现任务的浏览显示功能;添加任务窗体(AddTask.vb)实现记录新任务的功能。MainForm.vb中显示所有任务逻辑是由RefreshList方法实现的,代码如下。1 Private Sub RefreshList()2 Dim sql As String=select*from task3 DataGridView1.DataSource=db.DoSelect(sql)4 End Sub只要取出task表中所有数据,并绑定到DataGri

7、dView控件上即可。AddTask.vb中单击【保存】按钮时保存任务,其主要逻辑就是组装Insert语句,代码如下。1 Private Sub btSave_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles btSave.Click2 设置语句3 Dim sql As String=insert into task(id,title,cycle,begintime)values(id,title,cycle,begintime)4 设置参数5 Dim params(3)As System.Data.

8、OleDb.OleDbParameter6 params(0)=New System.Data.OleDb.OleDbParameter(id,IDManager.GetIssueID()7 params(1)=New System.Data.OleDb.OleDbParameter(title,tbTitle.Text)8 params(2)=New System.Data.OleDb.OleDbParameter(cycle,cbCycle.SelectedItem.ToString()9 params(3)=New System.Data.OleDb.OleDbParameter(beg

9、intime,DateTimePicker1.Value.ToString(yyyy-MM-dd HH:mm:ss)10 执行11 If db.DoUpdate(sql,params)=1 Then12 Me.DialogResult=Windows.Forms.DialogResult.OK13 Else14 MessageBox.Show(db.Message)15 End If16 17 End Sub删除任务的主要逻辑就是组织Delete语句,代码如下。1 Private Sub cmsDeleteTask_Click(ByVal sender As System.Object,ByV

10、al e As System.EventArgs)Handles cmsDeleteTask.Click2 Dim sql As String=delete from task where id=id3 Dim params(0)As System.Data.OleDb.OleDbParameter4 params(0)=New System.Data.OleDb.OleDbParameter(id,SelectedTask)5 Dim rows As Integer=db.DoUpdate(sql,params)6 If rows=1 Then7 DataGridView1.Rows.Rem

11、ove(DataGridView1.SelectedRows(0)8 End If9 End Sub程序的自动提醒实现原理是某个线程不断检测是否有提醒任务,如果有则发出相应信号,然后会调用提醒窗口提醒用户。下面这段代码是一个检测是否有可提醒任务的实现。1 2 获取提醒3 4 5 Private Sub GetAlerts()6 Dim tasks As DataTable=task.CheckTask()7 如果没有任务则中断执行8 If tasks Is Nothing Then9 Exit Sub10 End If11 用于判断是否有新提醒12 Dim isDiff=False13 第一次

12、加载14 If AlertForm.Instance.Data Is Nothing Then15 isDiff=True16 Else17 判断是否发生了改变18 For Each dr As DataRow In tasks.Rows19 如果新的任务没有出现过,则表示为数据源发生了变化20 Dim filter=id=&dr(id)&21 If AlertForm.Instance.Data.Select(filter).Count=0 Then22 isDiff=True23 Exit For24 End If25 Next26 End If27 如果不同就提示28 If isDiff

13、 Then29 调用提醒窗口30 AlertForm.Instance.Data=tasks31 AlertForm.Instance.Show()32 End If33 End Sub分析:过程GetAlerts中为了避免反复提醒影响到用户其他工作,采用isDiff开关来保证只有新任务出现时才再次刷新提醒窗口内容。判断是否有新任务实际上就是将从数据库提取出来的任务与提醒窗口AlertForm已有的任务进行比对,如果发现有AlertForm窗口中所没有的任务则表示有新任务。接下来,我们使用Timer组件TimerOnce来定时执行GetAlerts过程,该控件包含了分线程和计时执行的功能,可谓

14、一举两得。这里为了减少程序CPU占用率,将Interval属性设置为10000,即10秒。1 Private Sub TimerOnce_Tick(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles TimerOnce.Tick2 GetAlerts()3 End SubTimerOnce的启动操作是在窗体Load事件发生时进行的,代码如下。1 Private Sub MainForm_Load(ByVal sender As System.Object,ByVal e As System.EventArgs)Ha

15、ndles MyBase.Load2 DataGridView1.AutoGenerateColumns=False 列表不自动产生列3 RefreshList()4 TimerOnce.Start()启动检测5 End Sub注意,当程序退出时要停止Timer,这里我们将这步操作放到主窗体关闭时进行,代码如下。1 Private Sub MainForm_FormClosing(ByVal sender As System.Object,ByVal e As System.Windows.Forms.FormClosingEventArgs)Handles MyBase.FormClosin

16、g2 TimerOnce.Stop()3 End Sub由于我们希望提醒窗口只有一个,如果有新的任务就体现到窗口的列表中,而不是新开一个窗口。所以我们用单例设计模式(Singleton)来实现这种效果。单例窗体的实现需要以下两个步骤。(1)屏蔽构造函数。这是防止他人使用构造函数实例化多个窗体对象的手段。我们将构造函数New访问修饰符降低到Private即可。(2)提供自定义构造方法。强制使用者在应用该窗体时使用,并在方法中实现单例控制。注意代码中的Instance属性,只能通过该属性来获取窗体实例。1 2 提醒窗体3 4 5 Public Class AlertForm6 Dim task A

17、s TaskClass=New TaskClass()7 Private Shared _Instance As AlertForm=Nothing8 9 窗体实例10 11 单例模式12 Public Shared ReadOnly Property Instance()As AlertForm13 Get14 If _Instance Is Nothing Then15 _Instance=New AlertForm()16 End If17 Return _Instance18 End Get19 End Property20 21 选择的任务22 23 Private ReadOnly

18、 Property SelectedTask()As String24 Get25 If DataGridView1.SelectedRows.Count=0 Then26 Return String.Empty27 Else28 Return DataGridView1.SelectedRows(0).Cells(colID).Value.ToString()29 End If30 End Get31 End Property32 33 屏蔽构造函数New34 35 这是实现单例窗体的一个步骤36 Private Sub New()37 此调用是 Windows 窗体设计器所必需的。38 I

19、nitializeComponent()39 在 InitializeComponent()调用之后添加任何初始化。40 关闭列表的自动产生列41 DataGridView1.AutoGenerateColumns=False42 43 End Sub44 45 提醒任务数据46 47 用于传递48 Public Property Data()As DataTable49 Set(ByVal value As DataTable)50 DataGridView1.DataSource=value51 End Set52 Get53 Return DataGridView1.DataSource

20、54 End Get55 End Property56 57 隐藏窗体58 59 60 Private Sub AlertForm_FormClosing(ByVal sender As System.Object,ByVal e As System.Windows.Forms.FormClosingEventArgs)Handles MyBase.FormClosing61 e.Cancel=True62 Me.Hide()63 End Sub64 65 解除任务66 67 Private Sub btRelease_Click(ByVal sender As System.Object,B

21、yVal e As System.EventArgs)Handles btRelease.Click68 task.ReleaseTask(SelectedTask)69 End Sub70 End Class解除任务实际上就是将任务从任务从Task表中移除,使检测线程不再检测到这个任务。由于被解除任务还要保存下来备份,所以这里就涉及到两个表达更新操作,我们使用ADO.NET中的事务控制来实现,详细代码如下。1 2 解除任务3 4 任务ID5 将任务转移到matured表6 Public Sub ReleaseTask(ByVal id As String)7 SQL集合8 Dim sqlLi

22、st As List(Of String)=New List(Of String)()9 将要存档的任务取出10 Dim sql1 As String=select title,content,cycle,begintime from task where id=&id&11 Dim dt As DataTable=db.DoSelect(sql1)12 参数13 Dim params(5)As OleDbParameter14 params(0)=New OleDbParameter(id,id)15 params(1)=New OleDbParameter(title,dt.Rows(0)

23、(title)16 params(2)=New OleDbParameter(content,dt.Rows(0)(content)17 params(3)=New OleDbParameter(cycle,dt.Rows(0)(cycle)18 params(4)=New OleDbParameter(begintime,dt.Rows(0)(begintime)19 params(5)=New OleDbParameter(restarttime,)周期性任务开始时间重设20 复制到matured表21 Dim sql2 As String=insert into maturedtask(

24、id,title,content,cycle,begintime)values(id,title,content,cycle,begintime)22 sqlList.Add(sql2)23 从task表中删除24 Dim sql3 As String=delete from task where id=id25 If dt.Rows(0)(cycle).ToString()无周期 Then26 sql3=update task set begintime=restarttime where id=id27 params(5)=New OleDbParameter(restarttime,Da

25、teTime.Now.ToShortTimeString()28 End If29 sqlList.Add(sql3)30 执行31 db.DoBatUpdate(sqlList,params)32 End Sub在Windows操作系统中要设置程序在操作系统启动时自动执行,可以考虑如下两种常用方法。(1)“启动”文件夹。(2)“Run”注册表。“HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersion”下有多个子键可以设置自动运行。键名作用Run目前最常见的自启动程序用于加载的地方RunServices在用户登录前及其他注册表自启动程序

26、加载前面加载RunOnce许多自启动程序要通过RunOnce子键来完成第一次加载“设置”窗体Setting.vb中对于设置自动启动的实现。首先SetAutoRun过程用于根据界面选择来设置注册表;GetAsAutoRun函数正好相反,用于读取注册表后设置界面。1 2 设置为自动运行3 4 5 Private Sub SetAutoRun(ByVal isAuto As Boolean)6 Dim regKey As String=myAssistant7 Dim reg As Microsoft.Win32.RegistryKey=Microsoft.Win32.Registry.LocalM

27、achine.OpenSubKey(SOFTWAREMicrosoftWindowsCurrentVersionRun,True)8 If isAuto Then9 Dim filePath As String=Application.ExecutablePath 启动文件路径10 reg.SetValue(regKey,filePath)11 Else12 If Not reg.GetValue(regKey)Is Nothing Then13 reg.DeleteValue(regKey)删除自动运行14 End If15 End If16 reg.Close()17 End Sub18

28、19 获取20 21 22 23 Private Function GetAsAutoRun()As Boolean24 Dim regKey As String=myAssistant25 Dim reg As Microsoft.Win32.RegistryKey=Microsoft.Win32.Registry.LocalMachine.OpenSubKey(SOFTWAREMicrosoftWindowsCurrentVersionRun)26 If reg.GetValue(regKey)Is Nothing Then27 Return False28 Else29 Return True30 End If31 reg.Close()32 End Function添加任务:主界面:到时提醒:设置开机运行:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 各类题库
版权提示 | 免责声明

1,本文(《Visual Basic NET 2008从基础到项目实战》课件22 Windows Form开发实例:日程提醒程序.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|