利用TreeView實(shí)現(xiàn)層次結(jié)構(gòu)數(shù)據(jù)導(dǎo)航查詢_第1頁
利用TreeView實(shí)現(xiàn)層次結(jié)構(gòu)數(shù)據(jù)導(dǎo)航查詢_第2頁
利用TreeView實(shí)現(xiàn)層次結(jié)構(gòu)數(shù)據(jù)導(dǎo)航查詢_第3頁
利用TreeView實(shí)現(xiàn)層次結(jié)構(gòu)數(shù)據(jù)導(dǎo)航查詢_第4頁
利用TreeView實(shí)現(xiàn)層次結(jié)構(gòu)數(shù)據(jù)導(dǎo)航查詢_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、文章發(fā)表于【電腦開發(fā)與應(yīng)用】,引用請(qǐng)注明出 處,謝謝!利用TreeView實(shí)現(xiàn)層次結(jié)構(gòu)數(shù)據(jù)導(dǎo)航查詢摘 要:為了充分發(fā)揮TreeView控件展示數(shù)據(jù)和導(dǎo)航查詢的作用,文章通過一個(gè)通訊錄實(shí)例,介紹了如 何在ADO.NET中利用TreeView實(shí)現(xiàn)層次結(jié)構(gòu)數(shù)據(jù)的加載及導(dǎo)航查詢,討論了如何做到精準(zhǔn)導(dǎo)航查詢。文章提 出的改進(jìn)的導(dǎo)航查詢方案中的自定義函數(shù),具有一定的借鑒意義。關(guān)鍵詞:ADO.NET; TreeView;層次結(jié)構(gòu)數(shù)據(jù);導(dǎo)航查詢引言C#是微軟推出的基于.NET平臺(tái)的開發(fā)語言,是一種使用簡單、功能強(qiáng)大、表達(dá)力豐富的語言。Visual Studio 2008中,.NET在數(shù)據(jù)存取方面做了很大的調(diào)整

2、。在.NET框架下,數(shù)據(jù)存取是由ADO.NET來完成的。 ADO.NET是一組用于和數(shù)據(jù)源進(jìn)行交互的面向?qū)ο箢悗?,通常情況下,數(shù)據(jù)源是數(shù)據(jù)庫。TreeView是一個(gè)重要的常用控件,經(jīng)常充當(dāng)導(dǎo)航器的作用。在實(shí)際的軟件開發(fā)中,常常需要將TreeView 與數(shù)據(jù)庫進(jìn)行連接,以填充其節(jié)點(diǎn)。用TreeView可以顯示諸如商品分類、區(qū)域名稱等等的層次結(jié)構(gòu)數(shù)據(jù)。 在大部分軟件的開發(fā)中,TreeView都是一個(gè)不可缺少的展示或者導(dǎo)航控件。TreeView的內(nèi)容加載一般來講 有三種方式:(1)界面設(shè)計(jì)時(shí)在TreeView設(shè)計(jì)器或者代碼中直接填充TreeView控件。(2)從XML文件中 讀取數(shù)據(jù)建立樹型結(jié)構(gòu)。(

3、3)從數(shù)據(jù)庫中讀取數(shù)據(jù),建立樹型結(jié)構(gòu)。本文將通過一個(gè)簡單的通訊錄實(shí)例, 介紹如何在ADO.NET中利用TreeView實(shí)現(xiàn)層次結(jié)構(gòu)數(shù)據(jù)的導(dǎo)航查詢。數(shù)據(jù)表設(shè)計(jì)本文TreeView控件的數(shù)據(jù)源,主要有三個(gè)字段:即分組號(hào)(id)、分組名稱(groupName)、上一級(jí)分 組號(hào)(parentId)。約定分組號(hào)作為用來標(biāo)識(shí)當(dāng)前分組的唯一標(biāo)識(shí)。當(dāng)分組的parentId為0時(shí),表示該分組為 頂級(jí)分組,否如arentId為一個(gè)大于0的值。如此形成一個(gè)具有層次結(jié)構(gòu)的數(shù)據(jù)源。存放聯(lián)系人分組的groups 表如表1所示。構(gòu)造groups表數(shù)據(jù)的內(nèi)容如圖1所示。/表dbo.groupsidgroupNameparen

4、tId1我的同學(xué)02初中同學(xué)13高中同學(xué)14大學(xué)同學(xué)15我的同事06領(lǐng)導(dǎo)57同事58我的朋友09本科同學(xué)410研究生同學(xué)413常聯(lián)系的814不常聯(lián)系的8表1聯(lián)系人分組groups表結(jié)構(gòu)字段名數(shù)據(jù)類型主鍵備注idInt是分組id號(hào)groupNameVarchar否分組名稱parentIdInt否上一級(jí)分組號(hào)圖1 groups表數(shù)據(jù)另外,實(shí)例中還需要一個(gè)聯(lián)系人信息表addressList,構(gòu)造表中數(shù)據(jù)如圖2所示,其中g(shù)roupId字段用來標(biāo) 記聯(lián)系人所在分組的組號(hào)。表db o. addr e s sLi s t 摘要idIxrNamesexbirthqqmobilehomeaddressgroup

5、ld TOC o 1-5 h z In 張小易 男 1981-1. 24242424二泉東路2342號(hào)312李小齊女1980-4.234234民路 123號(hào)9王曉丹男1982-3.56575813934242441解放路 23 號(hào)3郭文文女1985-4.678353413935345345旺莊路344號(hào)10陳爾東男1983Y.2142377713823423444解放路9號(hào)9徐茜茜女1988-4.6796793413454353555人民路88號(hào)2龐倍倍女1990-4.23425413634234234新華路234號(hào)6黃飛飛男1983-6.2

6、34674心路98號(hào)7顏娟娟女1981-8.234235民路8號(hào)13鄭佩I頁女1992-9.12355513523423442上海路98號(hào)14彭詩詩女1983-5.,145487413106586546旺莊路 12號(hào)10圖2聯(lián)系人信息表數(shù)據(jù)3. TreeView數(shù)據(jù)加載及其導(dǎo)航查詢的實(shí)現(xiàn)TreeView的數(shù)據(jù)來源于數(shù)據(jù)庫,本文將采用ADO.NET技術(shù)中的強(qiáng)類型D ataSet實(shí)現(xiàn)。3.1 強(qiáng)類型 DataSetDataSet屬于弱類型,這意味著無論何時(shí)從DataSet中檢索值,值都以System.Object的形式返回,需要 對(duì)這種值進(jìn)行轉(zhuǎn)換

7、。不幸的是,失敗不是在編譯時(shí)發(fā)生,而是在運(yùn)行時(shí)發(fā)生。要訪問弱類型DataTable中的 一個(gè)特定字段,我們需要用這樣的句法:DataTable.Rowsindex columnName。由此,DataTable的弱類 型性質(zhì)表現(xiàn)在于,我們需要通過一個(gè)字符串或序號(hào)索引來訪問字段名稱。而一個(gè)強(qiáng)類型的D ataTable,它的 所有的字段都是通過屬性的形式來實(shí)現(xiàn)的,訪問的編碼就會(huì)象這樣:DataTable.Rowsindex.columnName。要返回強(qiáng)類型對(duì)象,開發(fā)人員可以創(chuàng)建自定義業(yè)務(wù)對(duì)象,或者使用強(qiáng)類型的D ataSet。開發(fā)人員實(shí)現(xiàn)的 業(yè)務(wù)對(duì)象類,其屬性往往是對(duì)相應(yīng)的底層數(shù)據(jù)表的字段的映射

8、。而一個(gè)強(qiáng)類型的DataSet,則是Visual Studio 基于數(shù)據(jù)庫schema為我們生成的一個(gè)類,其成員的類型都是由這個(gè)schema決定的。強(qiáng)類型的DataSet本身, 是由繼承于ADO.NET中DataSet、DataTable和DataRow類的子類組成的。除了強(qiáng)類型的DataTable外,強(qiáng)類型 的DataSet現(xiàn)在還包括TableAdapter類,這些類包含了填充DataSet中的DataTable和把DataTable的改動(dòng)傳回 數(shù)據(jù)庫的各種方法。借助Visual Studi。中的工具,很容易生成強(qiáng)類型的數(shù)據(jù)集。篇幅所限,本文對(duì)強(qiáng)類型數(shù)據(jù)集的配置與使 用,以及項(xiàng)目窗體設(shè)計(jì)與配

9、置不做詳述。生成后的強(qiáng)類型數(shù)據(jù)集DataSet1.xsd如圖3所示。圖3強(qiáng)類型數(shù)據(jù)集DataSetl.xsd在DataSet1.xsd中的 addressList添加一個(gè)查詢,配置查詢語句為:select * from addressList wheregroupId=id,最后生成名為FillById和GetDataById的方法,主要用于返回指定分組編號(hào)的聯(lián)系人信息。id 是一個(gè)參數(shù),調(diào)用FillById或GetDataById方法時(shí),需要為其賦值。3.2 TreeView的數(shù)據(jù)加載Treeview是由節(jié)點(diǎn)TreeNode組成的,第一級(jí)TreeNode稱之為根節(jié)點(diǎn),在根節(jié)點(diǎn)之下一級(jí)的稱之為

10、某個(gè) 根節(jié)點(diǎn)的子節(jié)點(diǎn),某個(gè)子節(jié)點(diǎn)之下一級(jí)的子節(jié)點(diǎn)就稱為該子節(jié)點(diǎn)的子節(jié)點(diǎn)。我們一般常用節(jié)點(diǎn)的兩個(gè)屬性: 一個(gè)是Text屬性,即用來記錄顯示出來的內(nèi)容;另一個(gè)是Tag屬性,一般用唯一標(biāo)識(shí)碼對(duì)其進(jìn)行標(biāo)識(shí),以用 于在使用時(shí)對(duì)節(jié)點(diǎn)的識(shí)別。采用遞歸方法FillTree實(shí)現(xiàn)TreeView數(shù)據(jù)的動(dòng)態(tài)加載,F(xiàn)illTree代碼如下:public void FillTree(TreeNodeCollection tns, int strParentID)TreeNode tmpNd; int intId;DataView dv = new DataView(dataSet11.groups);dv.RowFil

11、ter = parentId= + strParentID + ”;篩選出該分組下的所有分組foreach (DataRowView drv in dv) tmpNd = new TreeNode();intId = Convert.ToInt32(drvid.ToString();tmpNd.Text = drvgroupName.ToString();tns.Add(tmpNd); /遍歷每個(gè)子分組,添加到該分組中FillTree(tmpNd.Nodes, intId);/遞歸添加子分組的子分組在窗體的Form1_Load事件中,添加如下代碼 FillTree(treeView1.Node

12、s, 0); treeView1.ExpandAll();,運(yùn) 行程序,效果如圖4所示。我的同學(xué)初中同學(xué) 高中同學(xué)大學(xué)同學(xué) 本科同學(xué) 研究生同學(xué)我的同事領(lǐng)導(dǎo)同事我的朋岌 常聯(lián)系的不常聯(lián)系的圖4 TreeView的數(shù)據(jù)加載3.3導(dǎo)航查詢的實(shí)現(xiàn)為了確保選中TreeView的某個(gè)節(jié)點(diǎn)后,窗體右側(cè)dataGridView中能顯示組內(nèi)的聯(lián)系人,我們想到可以 在TreeNode的Tag屬性中綁定當(dāng)前分組的id號(hào),然后把此id號(hào)傳遞到FillById方法,最終將查詢得到的數(shù)據(jù)顯 示在dataGridView里。編寫treeView 1的AfterSelect事件代碼如下,實(shí)現(xiàn)效果如圖5所示。private

13、void treeView1_AfterSelect(object sender, TreeViewEventArgs e) addressListTableAdapter1.FillById(dataSet11.addressList, (int)e.Node.Tag);圖5 TreeView導(dǎo)航查詢效果3.4改進(jìn)后的導(dǎo)航查詢的實(shí)現(xiàn)分析如上導(dǎo)航查詢,我們可以發(fā)現(xiàn)一個(gè)問題。例如,當(dāng)選中“本科同學(xué)”節(jié)點(diǎn)后,右側(cè)顯示兩條聯(lián)系 人信息,如圖5所示。當(dāng)選中“大學(xué)同學(xué)”節(jié)點(diǎn)后,因?yàn)椤氨究仆瑢W(xué)”是包含在“大學(xué)同學(xué)”分組里的,此 兩條聯(lián)系人信息理應(yīng)要顯示,但事實(shí)并未顯示,原因也很容易想到。由此,針對(duì)這種層次

14、結(jié)構(gòu)的數(shù)據(jù)導(dǎo)航 查詢,我們需要改進(jìn)。思路就是,當(dāng)選中某個(gè)分組后,我們應(yīng)該可以查詢出來該組及其所有子分組的信息。 在SQL Server中編寫如下自定義函數(shù),實(shí)現(xiàn)檢索分組及該分組下的所有分組。函數(shù)代碼如下:CREATE function dbo.f_getChild(ID int)returns t table(ID int,gname varchar(50),PID int,tLevel int)函數(shù)返回包含組號(hào),組名,上級(jí)組號(hào)以及層次的表asbegindeclare i intset i = 1 標(biāo)記當(dāng)前層次的變量insert into t select ID,groupName,paren

15、tID,i from groups where ID = IDwhile rowcount 0beginset i= i+ 1 層次變量自增insert into tselect a.ID,a.groupname,a.parentID,ifrom groups a,t bwhere a.parentID=b.ID and b.tLevel = i-1篩選上一級(jí)組號(hào)與等于當(dāng)前id的分組,即子分組endreturnend借助以上自定義函數(shù),如果想查詢“大學(xué)同學(xué)”下所有分組,我們只需要如此操作:Select * from f_getChild(4)“大學(xué)同學(xué)”組號(hào)為4,在SQL Server查詢分析

16、器中執(zhí)行查詢,結(jié)果如圖6所示。J結(jié)果消息IDgnamePIDt Level14大學(xué)同學(xué)112本科同學(xué)231=研究生同學(xué)2圖6 f_getChild函數(shù)演示效果接下來,我們需要更改強(qiáng)類型數(shù)據(jù)集DataSet1.xsd中addressList里的FillById和GetDataById方法為如下 SQL語句:select * from addressList where groupId in ( select id from f_getChild(id),此處用到一個(gè)嵌套子 查詢。再次運(yùn)行程序,選中TreeView的“大學(xué)同學(xué)”和“本科同學(xué)”后,效果分別為圖7、圖8所示,問題完 美解決。圖7選中“

17、大學(xué)同學(xué)”后效果圖圖8選中“本科同學(xué)”后效果圖4.結(jié)束語在.NET平臺(tái)中,借助C#語言,利用Treeview控件與ADO.NET的訪問數(shù)據(jù)庫的典型方法,實(shí)現(xiàn)了對(duì)SQL Server數(shù)據(jù)庫中層次結(jié)構(gòu)數(shù)據(jù)的動(dòng)態(tài)加載,并完美實(shí)現(xiàn)了導(dǎo)航查詢功能。尤其是改進(jìn)后的導(dǎo)航查詢方法中的 自定義函數(shù),具有很典型的意義。借助該函數(shù),不僅可以實(shí)現(xiàn)分組的導(dǎo)航,對(duì)于維護(hù)分組下的所有子分組 信息都具有一定的借簽意義。參考文獻(xiàn)1 Microsoft. Microsoft Visual Studio 2008 文檔. 吳文強(qiáng).用自定義TreeView控件實(shí)現(xiàn)層次結(jié)構(gòu)數(shù)據(jù)瀏覽功能J.電腦編程技巧與維護(hù).2010.9:44-453魏斌,馬繼輝,?;?基于遞歸算法的樹型結(jié)構(gòu)圖的設(shè)計(jì)與實(shí)現(xiàn)J.計(jì)算機(jī)應(yīng)用于軟件.2011.1:97TO IMPLEMENT THE SEARCH OF NAVIGATION ABOUTHIERARCHICAL DATA WITH TREEVIEW(Abstract: In order to display data and navigate data, the paper take an address book for example, introduced how to use TreeView in ADO.NET to load data and implement the

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論