利用TreeView實現(xiàn)層次結構數(shù)據(jù)導航查詢_第1頁
利用TreeView實現(xiàn)層次結構數(shù)據(jù)導航查詢_第2頁
利用TreeView實現(xiàn)層次結構數(shù)據(jù)導航查詢_第3頁
利用TreeView實現(xiàn)層次結構數(shù)據(jù)導航查詢_第4頁
利用TreeView實現(xiàn)層次結構數(shù)據(jù)導航查詢_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

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

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

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

10、某個 根節(jié)點的子節(jié)點,某個子節(jié)點之下一級的子節(jié)點就稱為該子節(jié)點的子節(jié)點。我們一般常用節(jié)點的兩個屬性: 一個是Text屬性,即用來記錄顯示出來的內(nèi)容;另一個是Tag屬性,一般用唯一標識碼對其進行標識,以用 于在使用時對節(jié)點的識別。采用遞歸方法FillTree實現(xiàn)TreeView數(shù)據(jù)的動態(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); /遍歷每個子分組,添加到該分組中FillTree(tmpNd.Nodes, intId);/遞歸添加子分組的子分組在窗體的Form1_Load事件中,添加如下代碼 FillTree(treeView1.Node

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

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

14、結構的數(shù)據(jù)導航 查詢,我們需要改進。思路就是,當選中某個分組后,我們應該可以查詢出來該組及其所有子分組的信息。 在SQL Server中編寫如下自定義函數(shù),實現(xiàn)檢索分組及該分組下的所有分組。函數(shù)代碼如下:CREATE function dbo.f_getChild(ID int)returns t table(ID int,gname varchar(50),PID int,tLevel int)函數(shù)返回包含組號,組名,上級組號以及層次的表asbegindeclare i intset i = 1 標記當前層次的變量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篩選上一級組號與等于當前id的分組,即子分組endreturnend借助以上自定義函數(shù),如果想查詢“大學同學”下所有分組,我們只需要如此操作:Select * from f_getChild(4)“大學同學”組號為4,在SQL Server查詢分析

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

17、大學同學”后效果圖圖8選中“本科同學”后效果圖4.結束語在.NET平臺中,借助C#語言,利用Treeview控件與ADO.NET的訪問數(shù)據(jù)庫的典型方法,實現(xiàn)了對SQL Server數(shù)據(jù)庫中層次結構數(shù)據(jù)的動態(tài)加載,并完美實現(xiàn)了導航查詢功能。尤其是改進后的導航查詢方法中的 自定義函數(shù),具有很典型的意義。借助該函數(shù),不僅可以實現(xiàn)分組的導航,對于維護分組下的所有子分組 信息都具有一定的借簽意義。參考文獻1 Microsoft. Microsoft Visual Studio 2008 文檔. 吳文強.用自定義TreeView控件實現(xiàn)層次結構數(shù)據(jù)瀏覽功能J.電腦編程技巧與維護.2010.9:44-453魏斌,馬繼輝,?;?基于遞歸算法的樹型結構圖的設計與實現(xiàn)J.計算機應用于軟件.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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論