导航

ADO.net+VB.net制作自己的大事提醒工具milestone(二)

Posted on 2005-08-11 22:36  边缘  阅读(1556)  评论(2编辑  收藏  举报
 

工具用户界面的窗体设计

1、窗体和控件的创建及工具基本功能

前面你已经看到了窗体上有6个标签,其中5个用于显示事项的顺序,一个显示励志警句的标题。用于获得系统当前的日期时间及选择日期的DateTimePicker(日期时间采集器)控件,其显示为当前日期,以便我们加深对今天的日期的印象,DateTimePicker控件是个很有用的控件,后面还要讲到。

窗体还有5个用于记录和显示事项的文本框,从Textbox1到Textbox5。还有9个按钮,其中一个用于更新的按钮,一个保存并退出的按钮,一个用来标识已完成事项并将该事项及自己的小结放入历史数据库。还有一个查看历史的按钮,点击它可以显示已完成的历史事项。四个 “提前”按钮是用于将该条事项提前一栏显示,还有一个“置顶”按钮,可以将第2-4条事项选定的一个事项置顶显示,如下图5:


    图5 双击选定第4条事项

点击“置顶”后就会将置顶到第1条,而原第1-3条依次成为第2-4条如下图6:


    图6 点击“置顶”后

然后,新建一个窗体,命名为:history。该窗体很简单,只有一个DataGrid控件,它用来显示已完成事项的历史记录。DataGrid控件是数据库应用中一个极其重要的控件,它提供到 ADO.NET 数据集的用户界面,该用户界面显示表格式数据并允许对数据源进行更新,尽管本工具没有用到它来做更新数据源操作。

至此,你对Milestone的功能基本上了解了,如何实现它们呢。我假定你对创建窗体和控件属性的设置方法是掌握的,况且本工具的窗体及控件也不复杂,这里我就不再详细讲述创建窗体和控件的过程了。

2、功能的代码实现

下面我讲讲功能的代码实现,让我们从窗体装载开始吧。

1)    主窗体Form1的Load(装载)事件

双击窗体Form1,看到代码窗口后输入以下代码:

        Dim das1 As New DataSet

        Dim drw1 As DataRow

        Dim cnn1 As New OleDb.OleDbConnection

        Dim dap1 As New OleDb.OleDbDataAdapter

        Dim connect1 As New connect

        Dim count1 As Integer

        Dim help As String

        count1 = 0

        connect1.cnnc(cnn1)

        dap1.SelectCommand = New OleDb.OleDbCommand("Select * from mes", cnn1)

        das1.Clear()

        dap1.Fill(das1, "mes")

        For Each drw1 In das1.Tables("mes").Rows

            inter = drw1(1)

            If count1 = 0 Then

                TextBox1.Text = inter

            End If

            If count1 = 1 Then

                TextBox2.Text = inter

            End If

            If count1 = 2 Then

                TextBox3.Text = inter

            End If

            If count1 = 3 Then

                TextBox4.Text = inter

            End If

            If count1 = 4 Then

                TextBox5.Text = inter

            End If

            count1 += 1

        Next

        colorset()

        TextBox1.SelectionStart = 0

        TextBox1.SelectionLength = 0

        Clipboard.SetDataObject(DateTimePicker1.Text)

        help = VB6.GetPath

        HelpProvider1.HelpNamespace = help + "\helpofmilestone.txt"

        ToolTip1.SetToolTip(TextBox1, TextBox1.Text)

        ToolTip1.SetToolTip(TextBox2, TextBox2.Text)

        ToolTip1.SetToolTip(TextBox3, TextBox3.Text)

        ToolTip1.SetToolTip(TextBox4, TextBox4.Text)

    ToolTip1.SetToolTip(TextBox5, TextBox5.Text)

这段程序的目的是将数据库中的数据读出并填到窗体上对应的文本框中。看过前面对ADO.net编程基础的介绍,我想这些对你已不是问题了。注意For Each drw1 In das1.Tables("mes").Rows …Next语句是通过drw1来遍历本地数据集DataTable对象的每一行,并将其填充到对应的文本框。datelab.Text = Today语句将系统日期放到datelab标签上显示。colorset()是颜色设置函数,用它可以将未完成的事项全部用红色显示,除了“已完成!”的,当然它还有更大的用途后面将要介绍(具体请看代码)。TextBox1.SelectionStart = 0和        TextBox1.SelectionLength = 0两句用于控制工具打开后第1个文本框中光标的显示位置。Clipboard.SetDataObject(DateTimePicker1.Text)这一句是将DateTimePicker1中日期的文本放入剪贴板,以方便我们在文本框中使用。

后面的语句中HelpProvider1.HelpNamespace = help + "\helpofmilestone.txt"是赋予HelpProvider1对象关联的帮助文件名为工具的说明文档helpofmilestone.txt文本文件,当然也可以是预先制做好的chm或htm文件,这样主窗体打开后按F1就可以看到帮助文档了。

最后的几个ToolTip1控件的相关语句后面会讲到。

注意,inter是在过程外定义的中间变量,其它过程还要用到。

2)    事件历史窗体history的Load(装载)事件

双击history窗体填入以下代码:

          connect1.cnnc(cnn1)

        dap1.SelectCommand = New OleDbCommand("Select * from finish", cnn1)

        dap1.Fill(das1, "finish")

        DataGrid1.DataSource = (das1.Tables("finish"))

当然前面还有变量设置,具体请看源代码。前面几个语句都已不是第一次使用了,它们的任务是连接数据库和填充本地数据集,DataGrid1.DataSource = (das1.Tables("finish"))是将本地数据集中的finish表绑定到DataGrid1,以供DataGrid1使用。

3)     “提前”按钮和“置顶”按钮

“提前”按钮的代码如下,这里仅举第2条事项后面的按钮的代码:

Private Sub Button2_Click(ByVal sender As System.Object, _  ByVal e As System.EventArgs) Handles Button2.Click

     swap(TextBox2.Text, TextBox1.Text)

     colorset()

    End Sub

其中swap函数的代码如下:

  Private Sub swap(ByRef oldstr As String, ByRef newstr As String)

        inter = oldstr

        oldstr = newstr

        newstr = inter

    End Sub

注意这里的参数传递方式是引用传递,因为值传递方式不会改变初始变量的值,我们这里则要改变调用者初始数据,所以需要使用引用传递。

实现置顶的功能,少许有点复杂。首先选定1条事项,双击之,然后该文本框的背景色和前景色变化表示选定,然后再点击“置顶”按钮。

比如如图5中选定第4项,其代码如下:

Private Sub TextBox4_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox4.DoubleClick

        If j = 0 Then

            TextBox4.ForeColor = Color.Yellow

            TextBox4.BackColor = Color.Blue

            j = 1

            If TextBox4.Text = "已完成!" Or TextBox4.Text = "" Then

                DoneBut.Enabled = False

            End If

        ElseIf j = 1 Then

            MessageBox.Show("您已经选择了需要处理的事项,请勿重复选择!", "多重选择事项警告", _

          MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

            Exit Sub

        End If

    End Sub

这里有一个标志变量j,它可以用于表示是否已经选择一个事项,以免多选产生混乱,这里我特别使用了MessageBox.Show,而不是MsgBox()因为在.Net下它虽然仍然受到支持,但首选方法还是使用上述新语法 MessageBox.Show()

IfThen   DoneBut.Enabled = False  … End If是根据文本框的内容是否为“已完成”或空来判断是否要将“完成”按钮置为不可用。

“置顶”按钮后面的代码这里就不再赘述了,它是根据文本框的背景色BackColor属性确定将谁置顶的,具体内容请看源代码。

其实四个“提前”按钮也可以使用“置顶”按钮的实现方法而改为一个按钮,但考虑到实际使用中的方便,这里没有这样做。

4)    “完成”按钮、“更新”按钮、“查看历史”按钮和“退出”按钮

“完成”按钮的代码如下:

Private Sub DoneBut_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DoneBut.Click

        If TextBox1.BackColor.Equals(Color.Blue) Then

            DoOver(TextBox1.Text)

        ElseIf TextBox2.BackColor.Equals(Color.Blue) Then

            DoOver(TextBox2.Text)

        ElseIf TextBox3.BackColor.Equals(Color.Blue) Then

            DoOver(TextBox3.Text)

        ElseIf TextBox4.BackColor.Equals(Color.Blue) Then

            DoOver(TextBox4.Text)

        ElseIf TextBox5.BackColor.Equals(Color.Blue) Then

            DoOver(TextBox5.Text)

        End If

        updatenow()

        colorset()

End Sub

相信你已经看出来“完成”按钮也是根据背景色来判断将哪一个事项置为“已完成”,并调用DoOver函数将该事项内容(可以改动并添加你的小结)保存到数据库。DoOver函数代码如下:

   Private Sub DoOver(ByRef txt As String)

        Dim additem1 As New addfinish

        inter = Now

        additem1.add(txt, inter)

        txt = "已完成!"

End Sub

首先创建一个addfinish类的新实例,然后将当前的日期和时间输入变量inter,再调用addfinish类的add方法,其中txt也是引用传递ByRef,这样随后相应文本框的文本就会改为:已完成!。

 “更新”按钮的代码如下:

Private Sub updateBut_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles updateBut.Click

        updatenow()

        colorset()

    End Sub

 updatenow()用来执行更新数据库包括ToolTip1的提示框内容的更新,具体内容请看源代码。

“查看历史”按钮的代码如下:

Private Sub historyBut_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles historyBut.Click

        Dim historyform As New history

        historyform.Show()

End Sub

就是创建一个新的history窗体的实例并用Show方法显示它,如下图7所示。


    图7 事件历史窗体显示

“退出”按钮的相应代码请看源代码,非常简单。

5)    日期时间采集器DateTimePicker1控件

在我们打开窗体时,它自动显示为当天的系统日期。前面我们已经知道在主窗体装载时日期的文本也自动填入剪贴板了以供我们在写事项的实际完成日期时不用再一个字一个字地录入了,体现了人性化的需求。

那么在写事项及小结用到日期怎么办呢?我们也可以在这个控件的ValueChanged事件处理程序中加入Clipboard.SetDataObject(DateTimePicker1.Text) 这一句,这样我们点击下拉按钮后选择一天,它就会自动填入剪贴板,我们复制一下就可以了。

4、添加帮助提示

别人用这个工具时就要帮助文档了,这里我们利用简单的HelpProvider控件为我们的按钮和标签添加帮助提示,从工具栏中拖出一个HelpProvider控件放到窗体上(实际会出现在窗体的下面),然后窗体的其它控件就会自动显示HelpProvider的Helpstring等属性在杂项属性中。前面主窗体Form1的Load事件里已有利用该控件调用工具的帮助文档的方法,你可以回过头再看看。

然后在从工具栏里双击一个ToolTip控件,和HelpProvider控件一样ToolTip属性会出现在每个控件的杂项属性中,输入相应的提示内容就可以在鼠标悬停到该控件时看到提示框了。至于在主窗体Form1的Load事件里最后几句就是通过ToolTip控件SetToolTip方法的将各文本框的提示内容设定为文本框文本内容本身。这样,鼠标悬停在文本框上就会有图8中的效果了。


    图8 文本框的提示

四、部署

这个工具是为了提醒我们要办或要发生的大事,那么自然要随系统一起启动了。首先我们将编译好的message.exe和mesdata.mdb及帮助文件helpofmilestone.txt等放入一个文件夹中(假定这个文件夹的名称为milestone),然后把这个文件夹放入C盘中(其实可以放入任意盘中)。然后在系统的开始菜单的“运行”框中输入regedit.exe打开注册表,找到HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run,Run项其中有很多键值,主要都是开机自动运行的软件的路径,为我们的工具手工添一个吧。右击“Run”,点击“新建”下的“字符串值”,修改名称为“milestone”,数值为message.exe的绝对路径,这里假定为“C:\milestone\message.exe”。Ok,重新启动机器,你就会看到该工具随系统启动并打开窗体。

另外,多用户Windows系统可以将本工具的文件放入“我的文档”,这样别人一般也就看不到你的内容了。

全部文件下载:/Files/brinksman/MileStone-s.rar