儘管一個典型的樹結構只有一個根節點,但 TreeView 控件允許您向樹結構中添加多個根節點。當您要顯示項目列表,但不顯示單個主根節點時(例如在產品類別列表中),這一功能很有用。
每個節點都具有一個 Text 屬性和一個 Value 屬性。Text 屬性的值顯示在 TreeView 控件中,而 Value 屬性則用於存儲有關該節點的任何附加數據(例如傳遞給與節點相關聯的回發事件的數據)。
單擊 TreeView 控件的節點時,將引發選擇事件(通過回發)或導航至其他頁。未設置 NavigateUrl 屬性時,單擊節點將引發 SelectedNodeChanged 事件,您可以處理該事件,從而提供自定義的功能。每個節點還都具有 SelectAction 屬性,該屬性可用於確定單擊節點時發生的特定操作,例如展開節點或摺疊節點。若要在單擊節點時不引發選擇事件而導航至其他頁,可將節點的 NavigateUrl 屬性設置爲除空字符串 ("") 之外的值。
節點的文本可以是兩種模式之一:選擇模式或導航模式。默認情況下,會有一個節點處於選定狀態。若要使節點處於導航模式,請將節點的 NavigateUrl 屬性設置爲空字符串以外的值。當節點處於導航模式時,禁用該節點的所有選擇事件。單擊處於導航模式的節點可將用戶鏈接到指定的 URL。可以選擇設置 Target 屬性以指定用來顯示鏈接內容的窗口或框架。
此屬性的值存儲在視圖狀態中
下面的代碼示例演示如何設置下一代碼示例的框架
<frameset cols="30%, 75%">
<frame name="Menu" src="TreeViewFramecs.aspx"/>
<frame name="Content" src="Home.aspx"/>
</frameset>
</html>
下面的代碼示例演示如何使用 NavigateUrl 屬性指定單擊節點時鏈接到的 URL。此示例用於在前一示例的框架集內顯示一個目錄。
<html>
<body>
<form runat="server">
<h3>TreeView Declarative Syntax Example</h3>
<asp:TreeView id="SampleTreeView"
runat="server">
<Nodes>
<asp:TreeNode Value="Home"
NavigateUrl="Home.aspx"
Text="Home"
Target="Content"
Expanded="True">
<asp:TreeNode Value="Page 1"
NavigateUrl="Page1.aspx"
Text="Page1"
Target="Content">
<asp:TreeNode Value="Section 1"
NavigateUrl="Section1.aspx"
Text="Section 1"
Target="Content"/>
</asp:TreeNode>
<asp:TreeNode Value="Page 2"
NavigateUrl="Page2.aspx"
Text="Page 2"
Target="Content">
</asp:TreeNode>
</asp:TreeNode>
</Nodes>
</asp:TreeView>
</form>
</body>
</html>
TreeView 控件的主要屬性包括 Nodes 和 SelectedNode。Nodes 屬性包含樹視圖中的頂級節點列表集合(類型爲TreeNodeCollection,因爲TreeNode可包含多個根節點,所以通過該屬性可獲取TreeView控件中所有根節點)。SelectedNode 屬性設置當前選中的節點(類型爲TreeNode)。由於 Windows 窗體 TreeView 控件以分層的方式顯示節點,因此,在添加節點時,必須注意其父節點。
在設計器中添加或移除節點
- 選擇 TreeView 控件。
- 在“屬性”窗口中,單擊 Nodes 屬性旁帶“省略號”的按鈕。 顯示“樹節點編輯器”。
- 若要添加節點,必須存在根節點;如果不存在根節點,必須先單擊“添加根”按鈕添加一個根節點。然後,就可通過選擇根節點或任何其他節點並單擊“添加子級”按鈕來添加子節點。
- 若要刪除節點,請選擇要刪除的節點,然後單擊“刪除”按鈕。
以編程方式添加、移除節點
- 使用樹視圖 Nodes 屬性的 Add 方法。
TreeNode newNode = new TreeNode("Text for new node");
treeView1.SelectedNode.Nodes.Add(newNode); - 使用樹視圖 Nodes 屬性的 Remove 方法移除單個節點,或使用 Clear 方法清除所有節點。
TreeView1.Nodes.Remove(treeView1.SelectedNode);
TreeView1.Nodes.Clear();
循環訪問TreeView 控件的所有節點
爲了對節點值執行某種運算,查看 Windows 窗體 TreeView 控件中的每個節點有時是很有用的。利用遞歸過程可完成此操作,該過程循環訪問每個樹集合中的每個節點。
樹視圖中的每個 TreeNode 對象都具有可用於定位樹視圖的屬性:FirstNode、LastNode、NextNode、PrevNode 以及 Parent。Parent 屬性值是當前節點的父節點。當前節點如果有子節點,則子節點將列在它的 Nodes 屬性中。TreeView 控件本身具有 TopNode 屬性,該屬性是整個樹視圖的根節點。
private void PrintRecursive(TreeNode treeNode)
{
// Print the node.
System.Diagnostics.Debug.WriteLine(treeNode.Text);
MessageBox.Show(treeNode.Text);
// Print each node recursively.
foreach (TreeNode tn in treeNode.Nodes)
{
PrintRecursive(tn);
}
}
// Call the procedure using the TreeView.
private void CallRecursive(TreeView treeView)
{
// Print each node recursively.
TreeNodeCollection nodes = treeView.Nodes;
foreach (TreeNode n in nodes)
{
PrintRecursive(n);
}
}
確定被單擊的 TreeView 節點
使用 EventArgs 對象返回對已單擊節點對象的引用。
通過檢查 TreeViewEventArgs 類(它包含與事件有關的數據),確定單擊了哪個節點。
protected void treeView1_AfterSelect (object sender, System.Windows.Forms.TreeViewEventArgs e)
{
// Determine by checking the Text property.
MessageBox.Show(e.Node.Text);
}
注意
或者,可以使用 MouseDown 或 MouseUp 事件的 MouseEventArgs,獲得單擊處的 Point 的 X 和 Y 座標值。然後,使用 TreeView 控件的 GetNodeAt 方法確定單擊了哪個節點。
向 TreeView 或 ListView 控件添加自定義信息
可以在 Windows 窗體 TreeView 控件中創建派生節點,或在 ListView 控件中創建派生項。派生使您得以添加任何所需的字段,和添加處理這些字段的自定義方法和構造函數。此功能的用途之一是將客戶對象附加到每個樹節點或列表項。雖然這裏的示例是關於 TreeView 控件的,但該方法同樣適用於 ListView 控件。
派生樹節點
創建一個從 TreeNode 類派生的新節點類,此新節點類具有一個記錄文件路徑的自定義字段。
class myTreeNode : TreeNode
{
public string FilePath;
public myTreeNode(string fp)
{
FilePath = fp;
this.Text = fp.Substring(fp.LastIndexOf("\\"));
}
}
使用派生的樹節點
新的派生樹節點可用作函數調用的參數。
在下面的示例中,文本文件位置的路徑設置是 My Documents 文件夾。這樣做是因爲假定大多數運行 Windows 操作系統的計算機都包含此目錄。這還將允許具有最低系統訪問級別的用戶安全地運行應用程序。
// You should replace the bold text file
// in the sample below with a text file of your own choosing.
// Note the escape character used (@) when specifying the path.
treeView1.Nodes.Add(new myTreeNode (System.Environment.GetFolderPath _
(System.Environment.SpecialFolder.Personal) _
+ @"\TextFile.txt") );
如果傳遞了這個樹節點,且它的類型被聲明爲 TreeNode 類,則需要將其強制轉換爲派生類。類型轉換是從一種對象類型到另一種對象類型的顯式轉換。
protected void treeView1_AfterSelect (object sender,
System.Windows.Forms.TreeViewEventArgs e)
{
myTreeNode myNode = (myTreeNode)e.Node;
MessageBox.Show("Node selected is " + myNode.FilePath);
}
爲 Windows 窗體 TreeView 控件設置圖標
若要顯示樹節點旁邊的圖像,可將 ImageList 分配給父 TreeView 控件的 ImageList 屬性,然後通過引用它在 ImageList 屬性中的索引值來分配 Image。將 ImageIndex 屬性設置爲當 TreeNode 處於未選定狀態時要顯示的 Image 的索引值。同樣,將SelectedImageIndex 屬性設置爲當 TreeNode 已選定時要顯示的 Image 的索引值
- 設置 TreeView 控件的 ImageList 屬性爲想要使用的現有 ImageList 控件。
這些屬性可在設計器中使用“屬性”窗口進行設置,也可在代碼中設置。
treeView1.ImageList = imageList1;
2.設置節點的 ImageIndex 和 SelectedImageIndex 屬性。ImageIndex 屬性確定正常和展開狀態下的節點顯示的圖像, SelectedImageIndex 屬性確定選定狀態下的節點顯示的圖像。