利用VB.NET制作通讯录(使用ACCESS数据库)

一、创建应用程序TXL

创建基于VB.NetWindows应用程序TXL,保存到指定的文件夹下。

二、创建数据库

1、创建ACCESS数据库TXL,在数据库中创建表txl,结构如下

将表保存到应用程序TXL所在的文件夹下

2、可以在数据库中输入测试用的数据

三、创建应用程序界面

1、创建应用程序界面如下图所示

2、各控件的命名规则

除标签、GroupBox外,其他都是汉语拼音首字母大写,从上到下,从左到右依次为:

XMCSRQZZXZZQQ1QQ2EMail1EMail2MSNZPSJLTJJLSYTXGJLXYTBCJLWJLSCJL

四、创建数据连接

1、添加OleDbDataAdapter数据适配器

打开窗体设计界面,在工具箱的常栏(其他栏也可以)的空白区域单击鼠标右键,选择【选择项】,在弹出的选择工具箱对话框中找到OleDbDataAdapter,如下图所示

先在筛选器中输入ole,然后在对话框中勾选OleDbDataAdapter,单击确定按钮即可。这时在工具箱的常规栏中多了一个OleDbDataAdapter,如下图所示:

2、添加数据适配器到窗体

拖动OleDbDataAdapter控件到窗体,此时会自动弹出数据适配器配置向导对话框,在对话框中单击【新建连接】按钮。在弹出的添加连接对话框中,单击更改按钮如下图所示:

在弹出的更改数据源对话框中选择Microsoft Access数据库文件,如下图所示:

单击确定按钮,然后出现添加连接对话框,单击浏览按钮找到项目文件夹下刚刚创建的TXL数据库,然后单击测试连接按钮,如果出现测试连接成功字样则数据源添加成功!!

注意:如果测试连接时出现 未指定的错误 ,这时把VB.NetAccess全部关闭再重新打开VB.Net程序,应该可以连接成功,个人感觉应该是并发连接过多的问题

单击确定按钮关闭添加连接对话框,此时可以看到如下图所示的连接字符串,即

Provider=Microsoft.Jet.OLEDB.4.0;DataSource=|DataDirectory|\TXL.mdb

注意:这里的DataDirectory是指应用程序所在的文件夹,即项目文件夹下的Bin文件夹的下DebugRelease文件夹(若应用程序是调试版本则在Debug下,是发布版则在Release下)。

然后在数据适配器配置向导对话框中单击下一步按钮,此时会弹出是否复制数据文件到项目输出目录中的对话框,单击按钮

接下来会提示数据库已经在项目中,是否覆盖,选择否(数据库文件保存在项目文件夹中,所以不需要覆盖)

在选择命令类型部分直接按默认选项,然后单击下一步按钮即可。

在生成SQL语句对话框中,单击查询生成器按钮,如下图所示:

在查询生成器界面,将txl表添加到查询设计器中,并勾选所有列,如下图所示。然后单击确定按钮关闭查询设计器,返回到生成SQL语句界面。

在查询设计器关闭后返回到生成SQL语句对话框界面时,单击下一步按钮则会弹出生成结果对话框,如下图所示:此时系统已经自动生成了对数据库进行选择、插入、更新和删除相对应的语句,用户不需要再为此担心。

单击完成按钮关闭对话框即可。此时系统会自动添加一个OleDbConnection控件到窗体下部。

3、生成数据集

右键单击OleDbDataAdapter,在弹出的对话框上单击生成数据集项,然后弹出生成数据集对话框,保持默认单击确定按钮即可,此时系统会自动添加DataSet11到窗体下部。

4、绑定数据到控件

.Net中大部分控件都可以进行绑定。可以进行数据绑定的控件都具有DataBindings属性,其中的Text部分是指该控件进行数据绑定后显示的内容,Tag是作为内部存储的部分(个人认为)。将XM文本框的DataBindings部分的Text设置为项目数据源下的Form1列表实例的DataSet11下的txl表的姓名字段,如下图所示:

可以按照此方法,将其他控件(除照片)外分别绑定到相应的字段上。

5、编写代码完成数据的显示

此时如果直接运行程序则会发现界面上并没有预料的数据出现。原因在于未将数据填充到数据集中。

在窗体的Form_Load事件中添加如下事件处理代码

Public Class Form1

    PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load

        OleDbDataAdapter1.Fill(DataSet11,"txl") '此处的表名txl与界面上进行绑定时应该一致

        ZP.ImageLocation= DataSet11.Tables("txl").Rows(0).Item("照片")

    EndSub

End Class

6、完成记录移动

要想实现记录的移动,需要使用BindingManagerBase来实现绑定数据控件与数据集之间的关联和移动。因为记录移动过程中各个按钮都需要使用,所以需要在窗体作用范围内声明该变量。

同时在记录移动的过程中,照片框要根据数据集中记录的位置中保存的照片文件的路径来加载相应的图片文件,此时需要从记录集的数据表中取出相应行的照片位置,然后将之加载的图片框中。

Public Class Form1

   Dim bmdata AsBindingManagerBase

    '首记录按钮事件处理程序

    PrivateSub SJL_Click(ByValsender As System.Object, ByVal e AsSystem.EventArgs) Handles SJL.Click

        bmdata.Position = 0 '第一条记录

        ZP.ImageLocation = DataSet11.Tables("txl").Rows(bmdata.Position).Item("照片") '照片需要单独处理

    EndSub

    '上一条按钮事件处理程序

    PrivateSub SYT_Click(ByValsender As System.Object, ByVal e AsSystem.EventArgs) Handles SYT.Click

        Ifbmdata.Position > 0 Then '当记录未到首部时可以向前移动一条,并显示照片

            bmdata.Position = bmdata.Position -1

            ZP.ImageLocation =DataSet11.Tables("txl").Rows(bmdata.Position).Item("照片")

        EndIf

    EndSub

    '下一条按钮事件处理程序

    PrivateSub XYT_Click(ByValsender As System.Object, ByVal e As System.EventArgs)Handles XYT.Click

        Ifbmdata.Position < bmdata.Count - 1 Then '当记录未到尾部时可以向后移动一条并显示照片

            bmdata.Position =bmdata.Position + 1

            ZP.ImageLocation =DataSet11.Tables("txl").Rows(bmdata.Position).Item("照片")

        EndIf

    EndSub

    '尾记录按钮事件处理程序

    PrivateSub WJL_Click(ByValsender As System.Object, ByVal e AsSystem.EventArgs) Handles WJL.Click

        bmdata.Position =bmdata.Count - 1

        ZP.ImageLocation =DataSet11.Tables("txl").Rows(bmdata.Position).Item("照片")

End Sub

End Class

7、数据库的进一步处理

对于要处理的数据库来说,应当保持当前的数据为最新的。在前面添加数据源到项目中时,系统询问是否将数据库复制到输出目录中,当时选择的结果为。在测试程序运行过程中可以发现,如果用户对数据库的内容作为改动(如插入、删除或更新了数据),下次程序再运行时又和原始的状态一样。这并不是程序的错误,而是数据库复制时选项未设置好。如果设置为始终复制,则不管程序运行时如何改变,下次程序运行时仍会将项目文件夹下的数据库复制到输出目录,此时会将刚刚修改过的数据库变为原始数据库,这种状态直到将整个程序发布之后才会正常。所以此处需要选择,如果较新则复制,这样当原始数据库的数据比输出文件夹中的数据库数据更新时才会复制(第一次时因为输出文件夹下没有数据库,所以会直接复制;以后输出文件夹中的数据库内容较新,而项目文件夹中的数据库内容则较旧所以不会再进行复制,也就不会出现覆盖掉新内容的情况了)。

五、实现数据处理功能

1、编写绑定数据到控件的通用过程

这个过程用于实现将数据集中的数据绑定到数据集的数据表txl的相应列上。因为已经在界面上完成了绑定工作,所以这个过程只用作编写代码完成绑定的参考。

    PrivateSub BindDataToControl()

        XM.DataBindings.Add("text", DataSet11, "txl.姓名")

        CSRQ.DataBindings.Add("text", DataSet11, "txl.出生日期")

        ZZ.DataBindings.Add("text", DataSet11, "txl.住址")

        XZZ.DataBindings.Add("text", DataSet11, "txl.现住址")

        QQ1.DataBindings.Add("text", DataSet11, "txl.QQ1")

        QQ2.DataBindings.Add("text", DataSet11, "txl.QQ2")

        MSN.DataBindings.Add("text", DataSet11, "txl.MSN")

        EMail1.DataBindings.Add("text", DataSet11, "txl.EMail1")

        EMail2.DataBindings.Add("text", DataSet11, "txl.EMail2")

    EndSub

 2、编写设置控件是否可用的通用过程

 PrivateSub EnableControl(ByValflag As Boolean)


        XM.Enabled = flag

        CSRQ.Enabled = flag

        ZZ.Enabled = flag

        XZZ.Enabled = flag

        QQ1.Enabled = flag

        QQ2.Enabled = flag

        EMail1.Enabled = flag

        EMail2.Enabled = flag

        MSN.Enabled = flag

        ZP.Enabled = flag


    EndSub

3、编写保存数据到数据库的通用过程

将数据保存到数据库时,首先需要将BindingManagerBase对象的当前编辑结束,然后调用数据适配器的Update方法来实现数据集到数据库的更新过程。

   PublicSub SaveChanges()  '更新数据集自定义过程

        bmdata.EndCurrentEdit()   '停止当前的任何编辑

       OleDbDataAdapter1.Update(DataSet11)

    End Sub

4、完成添加、修改、保存和删除记录按钮事件处理程序

1)添加记录按钮事件处理程序

添加记录时首先需要将控件可用,然后需要结束BindingManagerBase的当前编辑状态,记照片为空,最后需要添加一个新行到BindingManagerBase中。

    PrivateSub TJJL_Click(ByValsender As System.Object, ByVal e AsSystem.EventArgs) Handles TJJL.Click

        EnableControl(True) '使控件可用

        bmdata.EndCurrentEdit() '结束现有编辑

        ZP.ImageLocation = ""

        bmdata.AddNew() '添加新行

    EndSub

(2)保存记录按钮事件处理程序

保存时必须结束当前编辑,这一步非常重要。只有结束BindingManagerBase的当前编辑状态,其添加新行操作才算结束,这样在数据集的数据表中才会增加相应的新行,才可以将新行的照片列设置为图片框中图片的位置(如果是修改的话则不会出现问题);之后再将数据集的内容更新回数据库即可。

保存记录回数据库时,照片信息与其他数据不一样,不是绑定的,因此在保存之前,首先需要将照片对应的文件信息保存到数据集的数据表的相应行的对应列之后才能保存回数据库。

    PrivateSub BCJL_Click(ByValsender As System.Object, ByVal e AsSystem.EventArgs) Handles BCJL.Click

       bmdata.EndCurrentEdit()

       DataSet11.Tables("txl").Rows(bmdata.Position).Item("照片") = ZP.ImageLocation

        SaveChanges() '保存更改

        EnableControl(False) '恢复控件不可用

    EndSub

(3)修改记录按钮事件处理程序

这一步比较简单,就是让控件可用,此时用户可以修改,然后保存即可。

    PrivateSub XGJL_Click(ByValsender As System.Object, ByVal e As System.EventArgs)Handles XGJL.Click

        EnableControl(True) '控件可用

    EndSub

(4)删除记录按钮事件处理程序

删除记录之后,需要将照片显示为与当前记录相符的内容。

    PrivateSub SCJL_Click(ByValsender As System.Object, ByVal e AsSystem.EventArgs) Handles SCJL.Click

        bmdata.RemoveAt(bmdata.Position)'删除当前位置元素

        SaveChanges()

        ZP.ImageLocation =DataSet11.Tables("txl").Rows(bmdata.Position).Item("照片")

    End Sub

5、双击照片框实现加载图片事件处理程序

首先需要在工具箱的对话框项内拖动一个OpenFileDialog控件到窗体上。在代码中设置其只能打开.jpg图片文件,如果用户在文件框中选择了图片文件则将之加载的图片框中。此过程需要与保存记录按钮事件处理程序相辅

    PrivateSub ZP_DoubleClick(ByValsender As System.Object, ByVal e AsSystem.EventArgs) Handles ZP.DoubleClick

        OpenFileDialog1.Filter = "图片文件(*.jpg)|*.jpg|所有文件(*.*)|*.*"

        OpenFileDialog1.ShowDialog()

        IfOpenFileDialog1.FileName <> ""Then

            ZP.ImageLocation =OpenFileDialog1.FileName

        EndIf

    End Sub

6、修改窗体加载事件处理程序

窗体加载时只显示数据,此时不能编辑数据。

    PrivateSub Form1_Load(ByValsender As System.Object, ByVal e AsSystem.EventArgs) Handles MyBase.Load

        OleDbDataAdapter1.Fill(DataSet11,"txl") '此处的表名txl与界面上进行绑定时应该一致

        ZP.ImageLocation =DataSet11.Tables("txl").Rows(0).Item("照片") '初始时照片显示为第一条记录的内容

        bmdata =BindingContext(DataSet11, "txl") '创建BindingManagerBase对象

        EnableControl(False) '所有控件不能用

    End Sub