VB.NET通讯录源代码
利用VB.NET制作通訊錄(使用ACCESS數(shù)據(jù)庫(kù))
一、創(chuàng)建應(yīng)用程序TXL
創(chuàng)建基于VB.Net的Windows應(yīng)用程序TXL,保存到指定的文件夾下。
二、創(chuàng)建數(shù)據(jù)庫(kù)
1、創(chuàng)建ACCESS數(shù)據(jù)庫(kù)TXL,在數(shù)據(jù)庫(kù)中創(chuàng)建表txl,結(jié)構(gòu)如下
將表保存到應(yīng)用程序TXL所在的文件夾下
2、可以在數(shù)據(jù)庫(kù)中輸入測(cè)試用的數(shù)據(jù)
三、創(chuàng)建應(yīng)用程序界面
1、創(chuàng)建應(yīng)用程序界面如下圖所示
2、各控件的命名規(guī)則
除標(biāo)簽、GroupBox外,其他都是漢語(yǔ)拼音首字母大寫,從上到下,從左到右依次為:
XM、CSRQ、ZZ、XZZ、QQ1、QQ2、EMail1、EMail2、MSN、ZP、SJL、TJJL、SYT、XGJL、XYT、BCJL、WJL、SCJL
四、創(chuàng)建數(shù)據(jù)連接
1、添加OleDbDataAdapter數(shù)據(jù)適配器
打開窗體設(shè)計(jì)界面,在工具箱的常欄(其他欄也可以)的空白區(qū)域單擊鼠標(biāo)右鍵,選擇【選擇項(xiàng)】,在彈出的選擇工具箱對(duì)話框中找到OleDbDataAdapter,如下圖所示
先在篩選器中輸入ole,然后在對(duì)話框中勾選OleDbDataAdapter,單擊確定按鈕即可。這時(shí)在工具箱的常規(guī)欄中多了一個(gè)OleDbDataAdapter,如下圖所示:
2、添加數(shù)據(jù)適配器到窗體
拖動(dòng)OleDbDataAdapter控件到窗體,此時(shí)會(huì)自動(dòng)彈出數(shù)據(jù)適配器配置向?qū)?duì)話框,在對(duì)話框中單擊【新建連接】按鈕。在彈出的添加連接對(duì)話框中,單擊更改按鈕如下圖所示:
在彈出的更改數(shù)據(jù)源對(duì)話框中選擇Microsoft Access數(shù)據(jù)庫(kù)文件,如下圖所示:
單擊確定按鈕,然后出現(xiàn)添加連接對(duì)話框,單擊瀏覽按鈕找到項(xiàng)目文件夾下剛剛創(chuàng)建的TXL數(shù)據(jù)庫(kù),然后單擊測(cè)試連接按鈕,如果出現(xiàn)測(cè)試連接成功字樣則數(shù)據(jù)源添加成功!!
注意:如果測(cè)試連接時(shí)出現(xiàn) 未指定的錯(cuò)誤 ,這時(shí)把VB.Net和Access全部關(guān)閉再重新打開VB.Net程序,應(yīng)該可以連接成功,個(gè)人感覺應(yīng)該是并發(fā)連接過多的問題
單擊確定按鈕關(guān)閉添加連接對(duì)話框,此時(shí)可以看到如下圖所示的連接字符串,即
Provider=Microsoft.Jet.OLEDB.4.0;DataSource=|DataDirectory|\TXL.mdb
注意:這里的DataDirectory是指應(yīng)用程序所在的文件夾,即項(xiàng)目文件夾下的Bin文件夾的下Debug或Release文件夾(若應(yīng)用程序是調(diào)試版本則在Debug下,是發(fā)布版則在Release下)。
然后在數(shù)據(jù)適配器配置向?qū)?duì)話框中單擊下一步按鈕,此時(shí)會(huì)彈出是否復(fù)制數(shù)據(jù)文件到項(xiàng)目輸出目錄中的對(duì)話框,單擊是按鈕
接下來(lái)會(huì)提示數(shù)據(jù)庫(kù)已經(jīng)在項(xiàng)目中,是否覆蓋,選擇否(數(shù)據(jù)庫(kù)文件保存在項(xiàng)目文件夾中,所以不需要覆蓋)
在選擇命令類型部分直接按默認(rèn)選項(xiàng),然后單擊下一步按鈕即可。
在生成SQL語(yǔ)句對(duì)話框中,單擊查詢生成器按鈕,如下圖所示:
在查詢生成器界面,將txl表添加到查詢?cè)O(shè)計(jì)器中,并勾選所有列,如下圖所示。然后單擊確定按鈕關(guān)閉查詢?cè)O(shè)計(jì)器,返回到生成SQL語(yǔ)句界面。
在查詢?cè)O(shè)計(jì)器關(guān)閉后返回到生成SQL語(yǔ)句對(duì)話框界面時(shí),單擊下一步按鈕則會(huì)彈出生成結(jié)果對(duì)話框,如下圖所示:此時(shí)系統(tǒng)已經(jīng)自動(dòng)生成了對(duì)數(shù)據(jù)庫(kù)進(jìn)行選擇、插入、更新和刪除相對(duì)應(yīng)的語(yǔ)句,用戶不需要再為此擔(dān)心。
單擊完成按鈕關(guān)閉對(duì)話框即可。此時(shí)系統(tǒng)會(huì)自動(dòng)添加一個(gè)OleDbConnection控件到窗體下部。
3、生成數(shù)據(jù)集
右鍵單擊OleDbDataAdapter,在彈出的對(duì)話框上單擊生成數(shù)據(jù)集項(xiàng),然后彈出生成數(shù)據(jù)集對(duì)話框,保持默認(rèn)單擊確定按鈕即可,此時(shí)系統(tǒng)會(huì)自動(dòng)添加DataSet11到窗體下部。
4、綁定數(shù)據(jù)到控件
在.Net中大部分控件都可以進(jìn)行綁定??梢赃M(jìn)行數(shù)據(jù)綁定的控件都具有DataBindings屬性,其中的Text部分是指該控件進(jìn)行數(shù)據(jù)綁定后顯示的內(nèi)容,Tag是作為內(nèi)部存儲(chǔ)的部分(個(gè)人認(rèn)為)。將XM文本框的DataBindings部分的Text設(shè)置為項(xiàng)目數(shù)據(jù)源下的Form1列表實(shí)例的DataSet11下的txl表的姓名字段,如下圖所示:
可以按照此方法,將其他控件(除照片)外分別綁定到相應(yīng)的字段上。
5、編寫代碼完成數(shù)據(jù)的顯示
此時(shí)如果直接運(yùn)行程序則會(huì)發(fā)現(xiàn)界面上并沒有預(yù)料的數(shù)據(jù)出現(xiàn)。原因在于未將數(shù)據(jù)填充到數(shù)據(jù)集中。
在窗體的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與界面上進(jìn)行綁定時(shí)應(yīng)該一致
???? ?? ZP.ImageLocation= DataSet11.Tables("txl").Rows(0).Item("照片")
??? EndSub
End Class
6、完成記錄移動(dòng)
要想實(shí)現(xiàn)記錄的移動(dòng),需要使用BindingManagerBase來(lái)實(shí)現(xiàn)綁定數(shù)據(jù)控件與數(shù)據(jù)集之間的關(guān)聯(lián)和移動(dòng)。因?yàn)橛涗浺苿?dòng)過程中各個(gè)按鈕都需要使用,所以需要在窗體作用范圍內(nèi)聲明該變量。
同時(shí)在記錄移動(dòng)的過程中,照片框要根據(jù)數(shù)據(jù)集中記錄的位置中保存的照片文件的路徑來(lái)加載相應(yīng)的圖片文件,此時(shí)需要從記錄集的數(shù)據(jù)表中取出相應(yīng)行的照片位置,然后將之加載的圖片框中。
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("照片") '照片需要單獨(dú)處理
??? EndSub
??? '上一條按鈕事件處理程序
??? PrivateSub SYT_Click(ByValsender As System.Object, ByVal e AsSystem.EventArgs) Handles SYT.Click
??????? Ifbmdata.Position > 0 Then '當(dāng)記錄未到首部時(shí)可以向前移動(dòng)一條,并顯示照片
??????????? 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 '當(dāng)記錄未到尾部時(shí)可以向后移動(dòng)一條并顯示照片
??????????? 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、數(shù)據(jù)庫(kù)的進(jìn)一步處理
對(duì)于要處理的數(shù)據(jù)庫(kù)來(lái)說(shuō),應(yīng)當(dāng)保持當(dāng)前的數(shù)據(jù)為最新的。在前面添加數(shù)據(jù)源到項(xiàng)目中時(shí),系統(tǒng)詢問是否將數(shù)據(jù)庫(kù)復(fù)制到輸出目錄中,當(dāng)時(shí)選擇的結(jié)果為是。在測(cè)試程序運(yùn)行過程中可以發(fā)現(xiàn),如果用戶對(duì)數(shù)據(jù)庫(kù)的內(nèi)容作為改動(dòng)(如插入、刪除或更新了數(shù)據(jù)),下次程序再運(yùn)行時(shí)又和原始的狀態(tài)一樣。這并不是程序的錯(cuò)誤,而是數(shù)據(jù)庫(kù)復(fù)制時(shí)選項(xiàng)未設(shè)置好。如果設(shè)置為始終復(fù)制,則不管程序運(yùn)行時(shí)如何改變,下次程序運(yùn)行時(shí)仍會(huì)將項(xiàng)目文件夾下的數(shù)據(jù)庫(kù)復(fù)制到輸出目錄,此時(shí)會(huì)將剛剛修改過的數(shù)據(jù)庫(kù)變?yōu)樵紨?shù)據(jù)庫(kù),這種狀態(tài)直到將整個(gè)程序發(fā)布之后才會(huì)正常。所以此處需要選擇,如果較新則復(fù)制,這樣當(dāng)原始數(shù)據(jù)庫(kù)的數(shù)據(jù)比輸出文件夾中的數(shù)據(jù)庫(kù)數(shù)據(jù)更新時(shí)才會(huì)復(fù)制(第一次時(shí)因?yàn)檩敵鑫募A下沒有數(shù)據(jù)庫(kù),所以會(huì)直接復(fù)制;以后輸出文件夾中的數(shù)據(jù)庫(kù)內(nèi)容較新,而項(xiàng)目文件夾中的數(shù)據(jù)庫(kù)內(nèi)容則較舊所以不會(huì)再進(jìn)行復(fù)制,也就不會(huì)出現(xiàn)覆蓋掉新內(nèi)容的情況了)。
五、實(shí)現(xiàn)數(shù)據(jù)處理功能
1、編寫綁定數(shù)據(jù)到控件的通用過程
這個(gè)過程用于實(shí)現(xiàn)將數(shù)據(jù)集中的數(shù)據(jù)綁定到數(shù)據(jù)集的數(shù)據(jù)表txl的相應(yīng)列上。因?yàn)橐呀?jīng)在界面上完成了綁定工作,所以這個(gè)過程只用作編寫代碼完成綁定的參考。
??? 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.現(xiàn)住址")
??????? 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、編寫設(shè)置控件是否可用的通用過程
?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、編寫保存數(shù)據(jù)到數(shù)據(jù)庫(kù)的通用過程
將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)時(shí),首先需要將BindingManagerBase對(duì)象的當(dāng)前編輯結(jié)束,然后調(diào)用數(shù)據(jù)適配器的Update方法來(lái)實(shí)現(xiàn)數(shù)據(jù)集到數(shù)據(jù)庫(kù)的更新過程。
?? PublicSub SaveChanges()? '更新數(shù)據(jù)集自定義過程
??????? bmdata.EndCurrentEdit()?? '停止當(dāng)前的任何編輯
???????OleDbDataAdapter1.Update(DataSet11)
??? End Sub
4、完成添加、修改、保存和刪除記錄按鈕事件處理程序
(1)添加記錄按鈕事件處理程序
添加記錄時(shí)首先需要將控件可用,然后需要結(jié)束BindingManagerBase的當(dāng)前編輯狀態(tài),記照片為空,最后需要添加一個(gè)新行到BindingManagerBase中。
??? PrivateSub TJJL_Click(ByValsender As System.Object, ByVal e AsSystem.EventArgs) Handles TJJL.Click
??????? EnableControl(True) '使控件可用
??????? bmdata.EndCurrentEdit() '結(jié)束現(xiàn)有編輯
??????? ZP.ImageLocation = ""
??????? bmdata.AddNew() '添加新行
??? EndSub
(2)保存記錄按鈕事件處理程序
保存時(shí)必須結(jié)束當(dāng)前編輯,這一步非常重要。只有結(jié)束BindingManagerBase的當(dāng)前編輯狀態(tài),其添加新行操作才算結(jié)束,這樣在數(shù)據(jù)集的數(shù)據(jù)表中才會(huì)增加相應(yīng)的新行,才可以將新行的照片列設(shè)置為圖片框中圖片的位置(如果是修改的話則不會(huì)出現(xiàn)問題);之后再將數(shù)據(jù)集的內(nèi)容更新回?cái)?shù)據(jù)庫(kù)即可。
保存記錄回?cái)?shù)據(jù)庫(kù)時(shí),照片信息與其他數(shù)據(jù)不一樣,不是綁定的,因此在保存之前,首先需要將照片對(duì)應(yīng)的文件信息保存到數(shù)據(jù)集的數(shù)據(jù)表的相應(yīng)行的對(duì)應(yīng)列之后才能保存回?cái)?shù)據(jù)庫(kù)。
??? 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) '恢復(fù)控件不可用
??? EndSub
(3)修改記錄按鈕事件處理程序
這一步比較簡(jiǎn)單,就是讓控件可用,此時(shí)用戶可以修改,然后保存即可。
??? PrivateSub XGJL_Click(ByValsender As System.Object, ByVal e As System.EventArgs)Handles XGJL.Click
??????? EnableControl(True) '控件可用
??? EndSub
(4)刪除記錄按鈕事件處理程序
刪除記錄之后,需要將照片顯示為與當(dāng)前記錄相符的內(nèi)容。
??? PrivateSub SCJL_Click(ByValsender As System.Object, ByVal e AsSystem.EventArgs) Handles SCJL.Click
??????? bmdata.RemoveAt(bmdata.Position)'刪除當(dāng)前位置元素
??????? SaveChanges()
??????? ZP.ImageLocation =DataSet11.Tables("txl").Rows(bmdata.Position).Item("照片")
??? End Sub
5、雙擊照片框?qū)崿F(xiàn)加載圖片事件處理程序
首先需要在工具箱的對(duì)話框項(xiàng)內(nèi)拖動(dòng)一個(gè)OpenFileDialog控件到窗體上。在代碼中設(shè)置其只能打開.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、修改窗體加載事件處理程序
窗體加載時(shí)只顯示數(shù)據(jù),此時(shí)不能編輯數(shù)據(jù)。
??? PrivateSub Form1_Load(ByValsender As System.Object, ByVal e AsSystem.EventArgs) Handles MyBase.Load
??????? OleDbDataAdapter1.Fill(DataSet11,"txl") '此處的表名txl與界面上進(jìn)行綁定時(shí)應(yīng)該一致
??????? ZP.ImageLocation =DataSet11.Tables("txl").Rows(0).Item("照片") '初始時(shí)照片顯示為第一條記錄的內(nèi)容
??????? bmdata =BindingContext(DataSet11, "txl") '創(chuàng)建BindingManagerBase對(duì)象
??????? EnableControl(False) '所有控件不能用
??? End Sub
轉(zhuǎn)載于:https://blog.51cto.com/8935291/1566382
總結(jié)
以上是生活随笔為你收集整理的VB.NET通讯录源代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL 调试:无法启动 T-SQL 调试
- 下一篇: linux ps top 命令 VSZ,