❶ C#中treeview的使用方法
TreeView組件是由多個類來定義的,TreeView組件是由命名空間"System.視窗系統.Forms"中的"TreeView"類來定義的,而其中的節點(即Node),是由命名空間"System.視窗系統.Forms"中的"TreeNode"來定義的。所以當在程式中創建一個TreeView對象,其實只是創建了一個能放置節點的"容器"。而在這個容器中加入一個節點,其實就是加入了從"TreeNode"類中創建的一個節點對象;同樣刪除一個節點,也就是刪除一個"TreeNode"節點對象。
一. 本文中介紹的程式設計及運行環境
(1).微軟視窗2000 伺服器版
(2)..Net Framework SDK 正式版
二. C#操作TreeView組件中的一些常用方法及具體實現:
TreeView組件雖然是個操作起來比較麻煩的組件,但歸根到底,能總結為三種基本操作:加入子節點、加入兄弟節點和刪除節點。掌控了這三種常用操作,對於在編程中靈活運用TreeView組件是十分必要的。下面就分別來加以介紹。
(1).加入子節點:
所謂子節點,就是處於選定節點的下一級節點。加入子節點的具體過程是:首先要在TreeView組件中定位要加入的子節點的位置,然後創建一個節點對象,然後利用TreeVeiw類中對節點的加入方法(即:Add ( )方法),加入此節點對象。下面就是在treeView1組件中加入一個子節點的具體代碼:
//首先判斷是否選定組件中的位置
if ( treeView1.SelectedNode == null )
{
MessageBox.Show ( "請選擇一個節點" , "提示信息" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;
}
else
{
//創建一個節點對象,並初始化
TreeNode tmp ;
tmp = new TreeNode ( "節點名稱" ) ;
//在TreeView組件中加入子節點
treeView1.SelectedNode.Nodes.Add ( tmp ) ;
treeView1.SelectedNode = tmp ;
treeView1.ExpandAll ( ) ;
}
(2).加入兄弟節點:
所謂兄弟節點,就是在選定的節點的平級的節點。加入兄弟節點的方法和加入子節點的方法基本一致,只是在最後的實現方法上有著略微的差別。加入兄弟節點的具體步驟,首先也是要確定要加入的兄弟節點所處的位置,接著定義一個節點對象,最後調用TreeView類中對兄弟節點加入的方法,加入此節點對象。加入兄弟節點和加入子節點的最大差別就在於這最後一步。希望讀者能夠注意。下面是在TreeView組件加入一個兄弟節點的具體代碼:
//首先判斷是否選定組件中節點的位置
if ( treeView1.SelectedNode == null )
{
MessageBox.Show ( "請選擇一個節點" , "提示信息" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;
}
else
{
//創建一個節點對象,並初始化
TreeNode tmp ;
tmp = new TreeNode ( textBox1.Text ) ;
//在TreeView組件中加入兄弟節點
treeView1.SelectedNode.Parent.Nodes.Add ( tmp ) ;
treeView1.ExpandAll ( ) ;
}
(3).刪除節點:
刪除節點就是刪除TreeView組件中選定的節點,刪除節點能是子節點,也能是兄弟節點,但無論節點的性質怎麼,必須確保要刪除的節點沒有下一級節點,否則必須先刪除此節點中的所有下一級節點,然後再刪除此節點。刪除節點比起上面的二個操作要顯得略微簡單,具體方法是:首先判斷要刪除的節點是否存在下一級節點,如果不存在,就調用TreeView類中的Remove ( )方法,就能刪除節點了。下面是刪除TreeView組件中節點的具體代碼:
//判斷選定的節點是否存在下一級節點
if ( treeView1.SelectedNode.Nodes.Count == 0 )
//刪除節點
treeView1.SelectedNode.Remove ( ) ;
else
MessageBox.Show ( "請先刪除此節點中的子節點!" , "提示信息" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;
(4).TreeView組件的一些其他常用操作:
其他的一些常用操作比起上面的三種操作,在具體實現上要顯得簡單許多。這些常用操作無非是,展開所有節點,展開指定的節點、和折疊所有節點。下面就來具體介紹一下:
< I > .展開所有節點:
要展開TreeView組件中的所有節點,首先就要把選定的節點指針定位在TreeView組件的根節點上,然後調用選定組件的ExpandAll方法就能了,下面是具體代碼:
//定位根節點
treeView1.SelectedNode = treeView1.Nodes [ 0 ] ;
//展開組件中的所有節點
treeView1.SelectedNode.ExpandAll ( ) ;
< II > .展開選定節點的下一級節點:
由於只是展開下一級節點,所以就沒有必要用ExpandAll ( )方法了。展開下一級節點只需要調用Expand ( )方法就能了,下面是具體的實現代碼:
treeView1.SelectedNode.Expand ( ) ;
< III > .折疊所有節點:
折疊所有節點和展開所有節點是一組互操作,具體實現的思路也大致相同,折疊所有節點也是首先要把選定的節點指針定位在根節點上,然後調用選定組件的Collapse ( )就能了,下面是具體的實現代碼:
//定位根節點
treeView1.SelectedNode = treeView1.Nodes [ 0 ] ;
//折疊組件中所有節點
treeView1.SelectedNode.Collapse ( ) ;
至此已把在C#操作TreeView組件的常用方法和一般方法基本都介紹
北航嵌入式培訓
❷ C#中treeview的使用方法
你要導出的文件是一個集合還是什麼?
關於treeview的話,你需要先定義一個treeview對象,然後給它的一級標簽循環指定值,然後在它的循環裡面在循環將子標簽的值也給指定。然後將treeview對象與循環的值綁定就可以了。
❸ 怎樣使用C#TreeView控制項
方法/步驟
1
打開Microsoft Visual Studio 2010, 新建名字為【treeView】的程序。
2
在界面上添加【treeView】的控制項,並調整為合適大小。
3
在程序界面上加入其它需要的控制項:包括,
用於輸入父節點個數和子節點個數的2個輸入框;
生成節點的按鈕、刪除節點的按鈕、清除所有節點的按鈕;
輸出日誌信息的文本框。
4
編輯代碼,輸入【生成節點】的代碼;
獲取子節點和父節點的個數,使用循環添加父節點和子節點。
5
編輯【清除所有節點】的代碼。
6
編輯【刪除所選節點】的代碼。
7
點擊【treeview】控制項,在屬性中選擇行為,從行為列表中選擇【afterselect】雙擊,在代碼編輯頁面,添加節點被選擇後的代碼。
8
編輯輸出日誌的output方法的代碼。
9
生成exe文件進行測試
10
輸入父節點和子節點數量分別為2和4,生成樹結構。確認生成成功。
11
點擊【清除所有節點】,可以看到所有節點都已經被清空。
12
輸入父節點和子節點數量分別為3和3,生成樹結構。確認生成成功。
13
點擊【父節點3】的【子節點2】,點擊【刪除節點】。
14
可以看到該子節點已經被清空。再點擊【父節點2】。
15
點擊【刪除節點】,可以看到該父節點已經被清空。
16
點擊各個節點時,可以看到日誌中輸入對應的節點信息。
http://jingyan..com/article/335530daaf806019cb41c39f.html
❹ vb中treeview的使用方法
首先在 VB 中建立一個新工程,單擊「工程/部件」 ,在控制項列表中選中「 Microsoft Windows command controls6.0(sp4)」,按下「確定」按鈕返回主界面,在左側控制項 窗體中選中 Treeview 控制項置於窗體上,再放置一個 Imagelist 控制項、兩個 Label 控制項、兩 個 Textbox 控制項、六個 commandbutton 控制項,其屬性分別如下: Treeview 控制項:名稱 Treeview1; Imagelist 控制項:名稱 Imagelist1,並在該控制項中放置三張個性圖片(32×32) ,建立索 引 1、2、3; (方法:在 Imagelist 控制項上單擊滑鼠右鍵選擇屬性) Label 控制項:名稱分別為 Lab(0) 、Lab(1) ,Caption 分別為「父節點:、 」「子節點:; 」 Textbox 控制項:名稱分別為 Txt(0) 、Txt(1) ,text 都為「」 ; commandbutton 控制項:名稱為系統默認,Caption 分別為「添加」「展開」「收起」「排 、 、 、 序」「刪除」「退出」 、 、 ; 將下列代碼加入到代碼框: Option Explicit Dim I As Integer Dim J As Integer Dim nodx As Node Dim CunZai As Boolean '定義變數 Private Sub Command1_Click() If Txt(0).Text <> "" And Txt(1).Text <> "" Then '不允許建立零位元組的父節點和子節點 CunZai = False J = TreeView1.Nodes.Count For I = 1 To TreeView1.Nodes.Count '檢查新輸入的父節點名稱是否存在 If TreeView1.SelectedItem.Children > 0 Then If Txt(0).Text = TreeView1.Nodes(I).Text Then CunZai = True End If Next I If CunZai = True Then '若存在, 則在父節點下建立子節點 Set nodx = TreeView1.Nodes.Add(Txt(0).Text, tvwChild, "child" & J, Txt(1).Text, 3) Else ,若不存在,則建立父節點和子節點 Set nodx = TreeView1.Nodes.Add(, , Txt(0).Text, Txt(0).Text, 1) Set nodx = TreeView1.Nodes.Add(Txt(0).Text, tvwChild, "child" & J,_ Txt(1).Text, 3) End If TreeView1.Refresh ElseIf Txt(0).Text = "" Then MsgBox "請輸入父節點名稱!", vbInformation, "警告!" '系統提示 ElseIf Txt(1).Text = "" Then MsgBox "請輸入子節點名稱!", vbInformation, "警告!" End If End Sub Private Sub Command2_Click() For I = 1 To TreeView1.Nodes.Count
TreeView1.Nodes(I).Expanded = True '展開所有節點 Next I End Sub Private Sub Command3_Click() For I = 1 To TreeView1.Nodes.Count TreeView1.Nodes(I).Expanded = False '收起所有節點 Next I End Sub Private Sub Command4_Click() TreeView1.Sorted = True '排列順序 End Sub Private Sub Command5_Click() If TreeView1.SelectedItem.Index <> 1 Then TreeView1.Nodes.Remove TreeView1.SelectedItem.Index '刪除選定的節點 End If End Sub Private Sub Command6_Click() End '退出程序 End Sub Private Sub Form_Load() TreeView1.LineStyle =TvwTreeLines '在兄弟節點和父節點之間顯示線 TreeView1.ImageList = ImageList1 '鏈接圖像列 TreeView1.Style = '樹狀外觀包含全部元素 Set nodx = TreeView1.Nodes.Add(, , "蒲子明", "蒲子明", 1) '建立名稱為"蒲子明"的父節點,選擇索引為 1 的圖像 Set nodx = TreeView1.Nodes.Add("蒲子明", tvwChild, "child01", "收件箱", 3) '在"蒲子明"父節點下建立"收件箱"子節點,選擇索引為 3 的圖像 Set nodx = TreeView1.Nodes.Add("蒲子明", tvwChild, "child02", "發件箱", 3) '在"蒲子明"父節點下建立"發件箱"子節點,選擇索引為 3 的圖像 CunZai = False End Sub Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node) Node.ExpandedImage = 2 '節點被展開時,選擇索引為 2 的圖像 End Sub Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node) If TreeView1.SelectedItem.Children = 0 Then '檢查是否有子節點,0 為無 For I = 1 To TreeView1.Nodes.Count If TreeView1.Nodes(I).Selected Then MsgBox "您選擇的是:「" & TreeView1.Nodes(I).FullPath & "」子節點!" '系統提示 End If Next I End If
End Sub
❺ 怎樣使用TREEVIEW控制項
在進行VFP程序開發時,為了讓我們的應用程序看起來更加專業化,我們不可避免地要在設計過程中為程序添加一些專業的控制項。工欲善其事必先利其器,在進行程序設計時對所用的控制項必須有一個清晰的了解。本文要向大家介紹的就是TreeView控制項。TreeView控制項能夠以一種樹形目錄的方式來顯示各種資料,常見的TreeView控制項使用的例子就是注冊表編輯器和Windows的資源管理器,單擊節點的+號,你可以展開該節點,同樣你也可以關閉所展開的節點。如何在你的程序中加入TreeView控制項?接下來以VFP為例,向大家介紹TreeView控制項的使用方法。一、在表單中添加TreeView控制項TreeView控制項屬於OLE控制項。所以,在VFP中添加TreeView控制項的方法是在表單中加入OLE容器控制項,在出現了InsertObject標題之後,選擇InsertControl,在ObjectType欄內選擇MicrosoftTreeViewControl。之後,在表單上你就能看到TreeView控制項了。二、在TreeView控制項中加入節點往TreeView控制項中加入節點是一項很關鍵的工作。使用TreeView控制項中Node(節點)對象的Add方法,你便能夠定製由TreeView控制項顯示的內容(節點內容)。Add的用法如下:Add(relative,relationship,key,text,image,selectedimage)各個參數的含義如下:Relative:參照節點的鍵值。往TreeView控制項加入節點時,你能夠決定所添加的節點與業已存在的節點之間的關系。relative參數的作用就是指明已存在的節點的名稱(鍵值)。Relationship:指明欲加入的節點與業已存在的節點之間的關系。其可選值及具體含義如下:0:頂級節點,新添的節點放置在參照節點的最上面。1:末級節點,新添的節點放置在參照節點的最下面。2:次級節點,新添的節點緊跟參照節點。3:上級節點,新添的節點放在參照節點的上面。4:子節點,新添的節點為參照節點的子節點。需要說明的是,描述上述參數使用到的頂、末、次、上具體是指物理位置上的關系。並且,新添加的節點的存放位置與申明語句的先後位置無關。Key:新添加節點的鍵值(字元串類型),該鍵值必須是唯一的。Text:所添加節點的標題。Image和selectedimage:圖像索引值。可選參數(N型),指明新添加的節點在選中與沒選中時所顯示的不同圖像。通常,這些圖像是存放在ImageList(用來存放圖片的)控制項中的。在TreeView控制項中你可以設置該控制項的ImageList值。三、對TreeView控制項的常用操作 1.添加節點:添加節點的操作主要是由上面提到的Add函數完成的。由TreeView控制項中每個被顯示的目錄項被稱之為節點(Node),應該注意的是:在添加過程中,你操作的對象是節點,而非TreeView控制項本身。所以你不能直接使用TreeView.add命令。2.刪除節點:刪除節點主要是使用Remove函數,該函數的用法如下:Nodes.Remove(Key),Key指明欲刪除節點的鍵值。3.指明對TreeView控制項事件響應程序:在設計好TreeView之後,指明對事件如何響應是必不可少的。通常,最常用的是針對Click、DblClick和NodeClick事件,在設計此類事件的響應程序時,很自然地要涉及到確認用戶所選擇的節點。上面提到了,在對TreeView進行操作時,實際上是在對Node對象進行操作。Node對象中實際上是與之有關的各種數據(如:節點的Key值、Text值、Image值等等)和函數的結合體。通過對Node對象進行存取操作,一切都變得那麼容易了。四、實戰演習上面說了那麼多,還是親自動動手吧。下面的例子可以讓你對TreeView控制項有更加清晰地認識。這些程序並不復雜,但卻演示了TreeView控制項的基本原理及常用的操作。1.在TreeView控制項的Init事件中添加如下代碼,這些語句能夠讓你了解TreeView控制項中節點與節點之間的關系:this.nodes.add(,,TOP,參照目錄項)this.nodes.add(TOP,0,TopOnTop,參數0:放在參照目錄項的最上面)this.nodes.add(TOP,1,TOP1,參數1:放在參照目錄項的最下面)this.nodes.add(TOP,2,TOP2,參數2:緊靠參照目錄)this.nodes.add(TOP,3,TOP3,參數3:放在參照目錄的上面)this.nodes.add(TOP,4,Child?of?TOP,參數4:參照目錄的子目錄)this.nodes.add(Child?of?TOP,4,GrandSon?of?
❻ 十八、Treeview
Treeview是tkinter.ttk的控制項,這個控制項主要是提供多欄的顯示功能,我們可以稱其為
樹狀表格數據(Treeview)。在設計時也可以在左邊欄設計成樹狀結構或是稱層次結構,用戶
可以顯示或隱藏任何部分,這個最左邊的欄稱為圖標欄。
設計Treeview控制項的基本思想是,使用Treeview構造方法建立Treeview對象。
它的語法如下。
Treeview(父對象,options,···)
Treeview()方法的第一個參數是父對象,表示這個Treeview將建立在哪一個父對象內。
下列是Treeview()方法內其他常用的options參數。
(1)columns:欄位的字元串,其中,第一個欄位是圖標欄默認的,不在此設置范圍內,
如果設置columns=("Name","Age"),則控制項有三欄,首先是最左欄的圖標欄,可以進行展開
(expand)或是隱藏(collapse)操作,另外兩欄是Name和Age。
(2)cursor:可以設置游標在此控制項上的外觀。
(3)displaycolumns:可以設置欄位顯示順序。
1.如果參數是"#all"表示顯示所有欄,同時依建立順序顯示。
2.如果設置columns=("Name","Age","Date"),使用insert()插入元素時需要依次插入元素。
同樣狀況如果使用columns(2,0),(2,0)是指實體索引,則圖標欄在最前面,緊跟著是Date欄,
然後是Name欄。這種狀況也可以寫成columns("Date","Name")
(4)height:控制項每行的高度。
(5)padding:可以使用1~4個參數設置內容與控制項框的間距。
(6)selectmode:用戶可以使用滑鼠選擇項目的方式。
1.selectmode=BROWSE,一次選擇一項,這是默認。
2.selectmode=EXTENDED,一次可以選擇多項。
3.selectmode=NONE,無法用滑鼠執行選擇。
(7)show:默認是設置顯示圖標欄的標簽show="tree",如果省略則是顯示圖標欄,如果設為
show="headings",則不顯示圖標欄。
(8)takefocus:默認是True,如果不想被訪問可以設為False。
實例:簡單建立Treeview控制項的應用。
運行結果:
講解:tree=Treeview(root,columns=("cities"))建立Treeview控制項,此控制項
有一個欄位,域名是cities。
tree.heading("#0",text="State")和tree.heading("#1",text="City")使用heading()方法,
在這個方法內建立了欄標題,其中,第一個參數"#0"是指最左欄圖標欄位,"#1"是指第一個
欄位,所以這兩行分別建立了兩個欄標題。
tree.insert("",index=END,text="伊利諾",value="芝加哥")使用inert()方法插入Treeview控制項
內容,在這個方法中的第一個參數"",代表父id,因為圖標欄未來可以有樹狀結構,所以有這
一個欄位設計。當所建的欄是是最頂層時,可以用""空字元串處理。第二個參數index=END代表
將資料插入Treeview末端,它的思想與Text控制項的END相同。第三個參數text是設置圖標欄的
內容。第4個參數的values是設置City的內容。
樣例2:在建立Treeview控制項時,增加show="heading"參數,將不顯示圖標欄。
運行結果:
insert()方法第4個參數values是設置所插入的內容。如果有多欄時,須使用
values=(value1,value2,···),如果所設置的內容數太少時其他欄僵屍空白,如果所設置
的內容數太多時多出來的內容將被拋棄。
樣例3:增加population人口數欄位,其中,人口數的單位是萬人。
運行結果:
也可以將Python的列表應用於建立欄位內容。
Treeview控制項的column()方法主要用於格式化特定欄位的內容,它的語法格式如下。
column(id,options)
其中,id是指出特定欄位,可以用字元串表達,或是用"#index"索引方式。下列是options
的可能參數。
(1)anchor:可以設置欄內容參考位置。
(2)minwidth:最小欄寬,默認是20像素。
(3)stretch:默認是1,當控制項大小改變時欄寬將隨著改變。
(4)width:默認欄寬是200像素。
如果使用此方法不含參數,如下所示:
ret=column(id)
將以字典方式傳回特定欄所有參數的內容。
樣例:格式化,將第1、2欄寬度改為150,同時居中對齊,圖標欄則不改變。
建立Treeview控制項內容時,常常會需要在不同行之間用不同底色作區分,以方便使用者查看,
若是想設計這方面的程序,可以使用Tet控制項的標簽。Treeview控制項有tag_configure()方法,
可以使用這個方法建立標簽,然後定義此標簽的格式,可參考下列指令。
tag_configure("tagName",options,···)
上述第一個參數tagName是標簽名稱,可以用此名稱將此標簽導入欄位數據。
options的可能參數如下。
(1)background:標簽背景顏色。
(2)font:字形設置。
(3)foreground:標簽前景顏色。
(4)image:圖像與列表同時顯示。
要將標簽導入欄位使用的是insert()方法,這時需在此方法內增加tags參數設置,如下所示。
insert(···,tags="tagName")
樣例:將偶數行使用藍色底顯示。
層級式(Hierarchy),只要在圖標欄先建立top-level的項目id,然後將相關子項目放在所屬的
top-level項目d即可。
樣例:建立層級式的Treeview控制項內容。
在insert()方法內若是增加image參數可以添加圖像,在添加圖像時需要考慮的是可能row的
高度不足,所以必須增加高度。這時可以用下列Style()方法處理。
Style().conigure("TreeView","rowheight=xx") #xx是高度設置
樣例:設計一個含有圖像的Treeview。
Treeview控制項中可以有三種選擇模式,分別是BROWSE(默認)、EXTENDED、NONE,這是
使用selectmode參數設置的,當有新選擇項目發生時會產生虛擬事件<<TreeviewSelect>>,
其實我們可以針對此特性設計相關功能。
樣例:
在Treeview控制項中可以使用delete()方法刪除所選的項目,實例:
樣例:刪除所選的項目,這個程序在建立Treeview控制項時設置selectmode=EXTENDED,相當於一次
可以選擇多項,第二個選項在單擊滑鼠時可以同時按Ctrl鍵,可以選擇不連續的選項。如果
第二個選項在單擊滑鼠時同時按Shift鍵,可以選擇連續的選項。這個程序下方有Remove按鈕,
單擊此按鈕可以刪除所選項目。
在使用Treeview控制項時,另一個常用功能是插入項目。插入的方式與建立控制項的插入方法insert()
是一樣的。至於所插入的內容則可以使用tkinter的Entry控制項。
樣例:增加設計插入功能,由於這個Treeview控制項包含圖標欄下共有兩個欄位,所以若是想要
插入必須建立兩個Entry控制項。由於我們必須標出所插入的控制項,所以必須在Entry旁加上兩個
標簽。另外,在執行插入時必須使用一個按鈕表示出執行插入操作,所以必須另外創建一個按鈕。
講解:rowconfigure()方法的第一個參數是1,代表row=1,相當於讓row=1的Treeview
控制項隨著窗口縮放,縮放比由第二個參數weight=1得知是1:1縮放。columnconfigure()方法
的第一個參數是1,代表column=1,相當於讓column=1的stateEntry控制項隨著窗口縮放,縮放
比由第二個參數weight=1得知是1:1縮放。columnconfigure()方法內的第一個參數是3,代表
column=3,相當於讓column=3的cityEntry控制項隨著窗口縮放,縮放比由第二個參數weight=1
得知是1:1縮放。如果沒有上述設置,當縮放窗口時,所有組件大小將不會更改。
在使用Treeview控制項時,常常需要執行雙擊操作,最常見的是打開文檔。在Treeview控制項中
當發生雙擊時,會產生<Double-1>事件,我們可以利用這個功能建立一個雙擊的事件處理程序。
樣例:當雙擊Treeview控制項中的某個項目時,會出現對話框,列出所選的項目。
講解:identify("xxx",event.x,event.y)
第一個參數xxx可以是item、column、row,分別使用雙擊時的坐標,取得雙擊時的
item、column或row的信息,此例是使用item,所以我們可以由此獲得是哪一個項目被
雙擊。
在創建Treeview控制項後,由一個很常見的功能是將欄目信息做排序,通常可以單擊欄位標題就
可以執行排序。
樣例:排序Treeview控制項State欄的數據,在這個程序中為了簡化程序,省略了圖標欄。
所以Treeview控制項只有一個State欄,當單擊欄標題時可以正常排序,如果再單擊時可以
反向排序,排序方式將如此切換。
講解:heading()方法,當用滑鼠單擊標題欄時會執行command所指定的方法,這是
Lambda表達式,將"states"設置給變數c,然後將c當作參數傳遞給treeview_sortColumn()方法。
get_children([item])
它會傳回item的一個tuple的iid值,如果省略則是得到一個tuple,此tuple是top-level的iid值。
move()方法:
move(iid,parent,index)
將iid所指項目移至parent層次的index位置,此程序用""代表parent層次
❼ vb.net中TreeView控制項的使用
在中 TreeView(樹型結構)控制項是顯示節點(Node)對象的級層結構 它通常用於顯示一些有等級結構的信息 我們最為熟悉的就是Windows資源管理器左邊顯示文件和文件夾的窗口 在工具箱中 TreeView 控制項的圖標如下圖一所示
TreeView控制項的每個節點(Node對象)包含了一個標簽和可選的點點陣圖 每個節點又可能包含有若干個的子節點 可以通過控制某個節點來展開顯示或者折疊隱藏它所包含的子節點
一 TreeView 控制項的一些常用屬性
CheckBoxes 屬性 指示是否在樹視圖控制項中的樹節點旁顯示復選框
FullRowSelect 屬性 當 FullRowSelect 為 true 時 選擇突出顯示將跨越樹視圖的整個寬度 即整個顯示區域的寬度而不僅僅是樹節點標簽的寬度 如果 ShowLines 設置為 true 則將忽略 FullRowSelect 屬性
HideSelection 屬性 指示選定的樹節點是否即使在樹視圖已失去焦點時仍會保持突出顯示
HotTracking 屬性 如果 HotTracking 屬性設置為 true 那麼當滑鼠指針移過每個樹節點標簽時 樹節點標簽都將具有超級鏈接的外觀 Underline 字體樣式將應用於 Font 而 ForeColor 將設置為藍色 從而使標簽顯示為鏈接 注意 如果 CheckBoxes 屬性設置為 true HotTracking 屬性將失效
Indent 屬性 設置每個子樹節點級別的縮進距離(以像素為單位)
ItemHeight 屬性 設置樹視圖控制項中每個樹節點的高度
Nodes 屬性 獲取分配給樹視圖控制項的樹節點集合 這個屬性是TreeView 控制項最重要的屬性之一 我們下文將會對它進行更加的詳細的說明
PathSeparator 屬性 樹節點路徑(TreeNode FullPath 屬性)所使用的分隔符串 默認為反斜杠字元 () 樹節點路徑包括一組由 PathSeparator 分隔符串分隔的樹節點標簽 標簽的范圍為根樹節點到所需的樹節點 如下代碼我們可以獲得當前選中的節點的路徑
MessageBox Show(TreeView SelectedNode FullPath)
SelectedNode 屬性 獲取或設置當前在樹視圖控制項中選定的樹節點 如果沒有選定任何節點 則 SelectedNode 屬性則為Nothing
ShowLines 屬性 指示是否在樹視圖控制項中的樹節點之間繪制連線
ShowPlusMinus 屬性 指示是否在包含子樹節點的樹節點旁顯示加號 (+) 和減號 ( ) 按鈕
ShowRootLines 屬性 指示是否在樹視圖根處的樹節點之間繪制連線
如下圖二所示 為ShowLines 屬性 ShowPlusMinus 屬性 ShowRootLines 屬性都設置為True的情形
二 為TreeView 控制項添加節點
TreeView 控制項的 Nodes 屬性包含了它所有的節點 下面我們就來了解如何為樹狀控制項添加節點
通過樹節點編輯器添加
選中TreeView 控制項 在它的屬性對話框中找到Nodes 屬性 然後單擊它後面的省略號 彈出 樹節點編輯器 如下圖三所示
然後通過編輯器上的 添加根 來添加根節點 通過 添加子級 來為選中的節點添加子節點 通過 刪除 來刪除選定的節點 標簽 輸入框確定節點的名稱 注意 只有設置了TreeView 控制項的ImageList 屬性才能選擇設置節點的圖像
通過編程方式添加節點
給TreeView添加結點用到的是 Nodes Add 方法 首先選定要添加子結點的結點才能應用這個方法
TreeView中的結點的組織關系是父結點管理子結點的關系 也就是說 子結點組成的集合就是父結點的 Nodes 屬性 子結點的 Index 屬性 是根據其在子結點集合中的位置而決定的 而不是整棵樹中結點的位置 根據這個特點 若想找到指定結點須按以下的語法
TreeViewName Nodes Item(Index ) Nodes
而添加結點的方法為
TreeViewName Nodes Item(Index ) Nodes Add( NodeText )或
TreeViewName Nodes Item(Index ) Nodes Add( objNode )
如下代碼所示為選中的節點添加一個子節點
TreeView SelectedNode Nodes Add( )
編程刪除節點
使用Nodes屬性的Remove 方法刪除單個節點 也可以使用Clear 方法清除所有的節點 如下代碼所示
刪除選定的節點
TreeView Nodes Remove(TreeView SelectedNode)
清除TreeView 控制項的所有節點
TreeView Nodes Clear()
示例演示
我們現在用一個實例來看如何使用Nodes屬性來實現代碼編程添加刪除樹形控制項的節點 首先為設計如下圖四所示的程序界面 其中有四個Button 控制項 一個TreeView 控制項
為 添加根節點 按鈕添加如下代碼
TreeView Nodes Add( 根節點 & (TreeView GetNodeCount(False) + ))
注意 GetNodeCount方法為獲得本級別的節點數 可以通過參數False來指定不包括它的子節點
為 添加子節點 按鈕添加如下代碼
Dim node As TreeNode = TreeView SelectedNode
If Not node Is Nothing Then
node Nodes Add( 子節點 & (node GetNodeCount(False) + ))
Else
MessageBox Show( 沒有選中任何節點 )
End If
注意 TreeNode GetNodeCount 方法返回的是分配給 Nodes 集合的子樹節點的數目
為 刪除單個節點 按鈕添加代碼
Dim node As TreeNode = TreeView SelectedNode
If node Is Nothing Then
MessageBox Show( 沒有選中任何節點 )
Else
TreeView Nodes Remove(node)
End If
為 刪除所有節點 按鈕添加代碼
TreeView Nodes Clear()
代碼添加完畢後 運行程序 分別使用 添加根節點 添加子節點 為控制項添加節點 如下圖五所示
然後再試驗刪除節點的效果
三 訪問控制項的所有節點
因為Nodes集合中所包含的只是本級節點的集合 如果某個Node包含有子節點 並不會從當前的Nodes體現出來 如下代碼所示 我們只能訪問到所有的根節點而不是所有的節點
假定我們是在前面示例的基礎上添加一個名為 遍歷節點 的按鈕 然後在該按鈕的Click事件中添加如下代碼
Dim node As TreeNode
Dim str As String =
For Each node In TreeView Nodes
str = str & node Text & vbCr
Next
MessageBox Show(str)
node = Nothing
運行後 先分別為控制項添加若干個根節點與子節點 然後單擊 遍歷節點 按鈕 效果如下圖六所示
很明顯 我們遍歷了Nodes集合 但是並沒有如期訪問到子節點 怎麼解決這個問題呢?請看下一頁
如上頁的問題 我們假設一個根節點的Nodes集合為Nodes 該集合中的一個Node節點為Node Node 下有若干個子節點 我們把它的子節點的集合稱為Nodes 我們用For Each 遍歷Nodes 時 它訪問到Node 但不會訪問Nodes 集合
如果我們要訪問Nodes 就需要像遍歷Nodes 一樣遍歷Nodes 解決辦法如下
首先 建立一個過程用於遍歷一個Node節點下的子節點
Private Sub PrintNode(ByVal N As TreeNode)
Debug WriteLine(N Text)
Dim node As TreeNode
For Each node In N Nodes
PrintNode(node)
Next
End Sub
然後把 遍歷節點 的Click事件中修改為如下代碼
Dim node As TreeNode
For Each node In TreeView Nodes
PrintNode(node)
Next
node = Nothing
運行後 先分別為控制項添加若干個根節點與子節點 然後單擊 遍歷節點 按鈕 然後查看 輸出 窗口 效果如下圖七所示
可以發現已經能真正地遍歷了所有節點
lishixin/Article/program/net/201311/11617
❽ delphi中treeview的用法
例一
//刷新Tree 1
procere TMainForm.RefTree();
var
Tags:string ;
RootNode0,RootNode1,RootNode2,RootNode3,RootNode4,RootNode5:TtreeNode;
i:integer;
begin
TreeView1.Items.Clear;
RootNode0:=TreeView1.Items.Add(nil,'全部');
RootNode1:=TreeView1.Items.Add(nil,'資分類');
RootNode2:=TreeView1.Items.Add(nil,'部門');
RootNode3:=TreeView1.Items.Add(nil,'情況');
RootNode4:=TreeView1.Items.Add(nil,'位置');
RootNode5:=TreeView1.Items.Add(nil,'方式');
TreeView1.Items[0].ImageIndex:=11;
TreeView1.Items[1].ImageIndex:=54;
TreeView1.Items[2].ImageIndex:=54;
TreeView1.Items[3].ImageIndex:=54;
TreeView1.Items[4].ImageIndex:=54;
TreeView1.Items[5].ImageIndex:=54;
RootNode0.SelectedIndex:=RootNode0.ImageIndex;
RootNode1.SelectedIndex:=RootNode1.ImageIndex;
RootNode2.SelectedIndex:=RootNode2.ImageIndex;
RootNode3.SelectedIndex:=RootNode3.ImageIndex;
RootNode4.SelectedIndex:=RootNode4.ImageIndex;
RootNode5.SelectedIndex:=RootNode5.ImageIndex;
//分類
with DataM.q1 do
begin
SQL.Clear;
SQL.Add('Select Name1 from Navtree where tag=''分類'' ');
Open;
while not eof do
begin
TreeView1.Items.AddChild(RootNode1,FieldValues['Name1']);
next;
end;
end;
(此處省略365個字.....呵呵)
end;
例二
procere TForm1.showtree; //showtree自定義的
var
mynode:ttreenode;
begin
with adoquery1 do
begin
close;
sql.Clear;
sql.Add('select * from aa where value = ''1''');
open;
if recordcount <> 0 then
begin
treeview1.Items.Add(treeview1.TopItem,fieldbyname('name').AsString);
end;
end;
with adoquery2 do
begin
close;
sql.Clear;
sql.Add('select * from aa where len(name) = 4');
open;
while not eof do
begin
mynode:= treeview1.Items.AddChild(treeview1.TopItem,fieldbyname('name').AsString);
with adoquery3 do
begin
close;
sql.Clear;
sql.Add('select * from aa where name like '''+ '%'+ mynode.Text+ ''' and len(name) = 6');
open;
if recordcount <> 0 then
begin
first;
begin
treeview1.Items.AddChild(mynode,fieldbyname('name').AsString);
next;
end;
end;
end;
next;
end;
end;
end
例三
一、指標樹的建立
具體方法是:創建一個資料庫,設計指標表t_pub_index,包含index_id、parent_id、index_name欄位,其它欄位根據實際業務而定,指標名稱index_name將在樹型控制項的節點上顯示,index_id欄位保存節點的唯一標識號,parent_id表示當前節點的父節點號,標識號組成了一個「鏈表」,記錄了樹上節點的結構。設計一窗體Frm_sys_index,其上放置TreeView控制項tv_zb、Query控制項Query1及其它指標屬性編輯顯示控制項。一個樹的節點又包含文本(Text)和數據(Data)。Text為String類,用來顯示指標或指標目錄名稱。Data則為無定形指針(Untyped Pointer),可以指向一個與節點相聯系的數據結構,該結構與資料庫指標表相應域關聯,如指標ID、上級節點ID。
Query控制項的表達式為:
select index_id, parent_id, index_name from t_pub_index
start with index_id=0 connect by prior index_id=parent_id
其中start with 和connect by 是Oracle的SQL語句的保留字,使一條記錄的parent_id列的值等於前一記錄的index_id列的值,並以parent_id等於0的記錄開始。
建樹的基本思路是:
procere TFrm_sys_index.createtree;
var
curValue: indexPointer; //指向與節點相聯系的數據結構的指針
curNode : TTreeNode; //當前節點
curid : integer; //當前節點標識號
begin
curNode := nil;
curid := -1;
Query_index.Open;
Query_index.first;
while not Query_index.Eof do
begin
new(curValue);
With curValue^ do
將資料庫指標表t_pub_index各欄位值賦curValue 所指數據結構
while(curid <> curValue.parent_id) do //當前節點的標識號不等於當前記錄的父節點號
begin
curNode := curNode.parent;
curid:= indexPointer(curNode.data).index_id;
end;
curNode := tv_zb.Items.AddChildObject(curNode,
curValue^.index_name,curValue); //在當前節點上添加子節點,顯示節點指標名稱,所帶指針指向一個與指標數據相聯系的數據結構
curid := indexPointer(curNode.data).index_id;
Query_index.next;
end;
Query_index.close;
end;
二、增加、刪除、修改樹節點
單純在Treeview 上增加、刪除、修改節點只需用它本身提供的Treeview.Items. AddChildObject、 Treeview.Selected.Delete、Treeview.Selected.EditText等方法即可,但要相應修改資料庫中的數據,必須通過遞歸調用同一個函數(用於刪除一個選項)來遍歷所選節點下的所有子節點。下面以刪除節點為例介紹具體實現流程:
function TFrm_sys_index.delnode(node1:TTreenode):TTreenode;
var
childnode:TTreenode;
begin
childnode:=node1.GetLastChild; //按倒序獲得子項,因為刪除選項時,列表會發生變化
while childnode<>nil do
childnode:=delnode(childnode); //如子項不為空,進行遞歸調用
index_id:=inttostr(indexpointer(node1.data).index_id);//獲得該節點對應指標
在資料庫刪除相應指標;
result:=node1.parent.GetPrevChild(node1); //定位到該節點的上一節點
node1.delete; //刪除樹節點
end;
三、拖動樹節點
拖動樹節點基本上是通過建立目標項的新子項、向它復制源項、刪除原項來移動選項。與上述刪除操作相似,也是通過遞歸調用同一個函數(用於移動一個選項),按倒序移動所選節點下的所有子節點。下面是遞歸過程的代碼:
procere TFrm_sys_index.CopyNodeUnder(treeview:TTreeview;
sourcenode,targetnode:ttreenode);
var
newnode:ttreenode;
i:integer;
begin
newnode:=treeview.items.addchildfirst(targetnode,''); //建立目標項
newnode.assign(sourcenode); //復制源項屬性
for i:=sourcenode.count-1 downto 0 do //遞歸調用,按倒序移動其所有子項
CopyNodeUnder (treeview,sourcenode.item[i],newnode);
treeview.items.delete(sourcenode); //刪除源項
end;
Treeview對拖動操作提供支持,我們將組件的DragKind屬性設置為dkDrag,DragMode屬性設置為dmAutomatic,並為OnDragOver與OnDragDrop事件編寫了處理程序。OnDragOver事件處理程序對允許移動的條件進行判斷,排除需要避免的特殊情況。代碼如下:
procere TFrm_sys_index.tv_zbDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
var
targetnode,sourcenode:TTreenode;
begin
targetnode:=tv_zb.getnodeat(x,y);
if (Source=Sender) and (targetnode<>nil) then //保證移動在TreeView上,且目標節點不為空
begin
Accept:=true;
sourcenode:=tv_zb.selected;
//以下代碼防止用戶將一個選項拖到其子項上(它會隨著選項一起移動,導致死循環)
while (targetnode.parent<>nil) and (targetnode <> sourcenode) do
targetnode:=targetnode.parent;
if (targetnode = sourcenode) then Accept:=false;
end
else Accept:=false;
end;
OnDragDrop事件處理程序啟動前述移動過程CopyNodeUnder,修改資料庫數據。此外,在大批量添加數據到Treeview中時最好使用TreeView.Items.BeginUpdate和 TreeView.Items.EndUpdate,這樣能加快顯示速度。大致流程如下:
procere TFrm_sys_index.tv_zbDragDrop(Sender, Source: TObject; X,
Y: Integer);
var
targetnode,sourcenode:TTreenode;
begin
targetnode:=tv_zb.getnodeat(x,y); //獲得源節點
sourcenode:=tv_zb.selected; //獲得目標節點
修改資料庫中當前節點的父節點號parent_id,使其等目標節點標識號;
tv_zb.items.beginupdate; //禁用TreeView重繪操作
try
nodeunder(tv_zb,sourcenode,targetnode); //啟動移動過程
tv_zb.selected:=targetnode;
finally
tv_zb.items.enpdate; //重新設置
end;
end;
例四
給你一段超級短的代碼,caption欄位就是你的value欄位,因value是保留字,所以我改成這個了。
procere TForm1.Button1Click(Sender: TObject);
var
ss: TStrings;
begin
AdoQuery1.SQL.Text := 'SELECT name,caption FROM test8 ORDER BY name';
AdoQuery1.Open;
ss := TStringList.Create;
while not AdoQuery1.Eof do
begin
ss.Add(StringOfChar(#9,(Length(Trim(AdoQuery1.FieldValues['name'])) div 2)-1)
+ AdoQuery1.FieldValues['caption']);
AdoQuery1.Next;
end;
ShowMessage(ss.Text);
ss.SaveToFile('d:\test8.txt');
ss.Free;
TreeView1.LoadFromFile('d:\test8.txt');
end;