尽管一个典型的树结构只有一个根节点,但 TreeView 控件允许您向树结构中添加多个根节点。当您要显示项目列表,但不显示单个主根节点时(例如在产品类别列表中),这一功能很有用。
每个节点都具有一个 Text 属性和一个 Value 属性。Text 属性的值显示在 TreeView 控件中,而 Value 属性则用于存储有关该节点的任何附加数据(例如传递给与节点相关联的回发事件的数据)。
单击 TreeView 控件的节点时,将引发选择事件(通过回发)或导航至其他页。未设置 NavigateUrl 属性时,单击节点将引发 SelectedNodeChanged 事件,您可以处理该事件,从而提供自定义的功能。每个节点还都具有 SelectAction 属性,该属性可用于确定单击节点时发生的特定操作,例如展开节点或折叠节点。若要在单击节点时不引发选择事件而导航至其他页,可将节点的 NavigateUrl 属性设置为除空字符串 ("") 之外的值。
节点的文本可以是两种模式之一:选择模式或导航模式。默认情况下,会有一个节点处于选定状态。若要使节点处于导航模式,请将节点的 NavigateUrl 属性设置为空字符串以外的值。当节点处于导航模式时,禁用该节点的所有选择事件。单击处于导航模式的节点可将用户链接到指定的 URL。可以选择设置 Target 属性以指定用来显示链接内容的窗口或框架。
此属性的值存储在视图状态中
下面的代码示例演示如何设置下一代码示例的框架
下面的代码示例演示如何使用 NavigateUrl 属性指定单击节点时链接到的 URL。此示例用于在前一示例的框架集内显示一个目录。
TreeView 控件的主要属性包括 Nodes 和 SelectedNode。Nodes 属性包含树视图中的顶级节点列表集合(类型为TreeNodeCollection,因为TreeNode可包含多个根节点,所以通过该属性可获取TreeView控件中所有根节点)。SelectedNode 属性设置当前选中的节点(类型为TreeNode)。由于 Windows 窗体
在设计器中添加或移除节点
- 选择 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 属性,该属性是整个树视图的根节点。
{
// 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 类(它包含与事件有关的数据),确定单击了哪个节点。
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 类派生的新节点类,此新节点类具有一个记录文件路径的自定义字段。
{
public string FilePath;
public myTreeNode(string fp)
{
FilePath = fp;
this.Text = fp.Substring(fp.LastIndexOf("\\"));
}
}
使用派生的树节点
新的派生树节点可用作函数调用的参数。
在下面的示例中,文本文件位置的路径设置是 My Documents 文件夹。这样做是因为假定大多数运行 Windows 操作系统的计算机都包含此目录。这还将允许具有最低系统访问级别的用户安全地运行应用程序。
如果传递了这个树节点,且它的类型被声明为 TreeNode 类,则需要将其强制转换为派生类。类型转换是从一种对象类型到另一种对象类型的显式转换。
为 Windows 窗体 TreeView 控件设置图标
若要显示树节点旁边的图像,可将 ImageList 分配给父 TreeView 控件的 ImageList 属性,然后通过引用它在 ImageList 属性中的索引值来分配 Image。将 ImageIndex 属性设置为当 TreeNode 处于未选定状态时要显示的 Image 的索引值。同样,将SelectedImageIndex 属性设置为当 TreeNode 已选定时要显示的 Image 的索引值
- 设置 TreeView 控件的 ImageList 属性为想要使用的现有 ImageList 控件。
这些属性可在设计器中使用“属性”窗口进行设置,也可在代码中设置。
treeView1.ImageList = imageList1; -
设置节点的 ImageIndex 和 SelectedImageIndex 属性。ImageIndex 属性确定正常和展开状态下的节点显示的图像, SelectedImageIndex 属性确定选定状态下的节点显示的图像。
treeView1.SelectedNode.ImageIndex = 0;
treeView1.SelectedNode.SelectedImageIndex = 1;