TreeView控件

尽管一个典型的树结构只有一个根节点,但 TreeView 控件允许您向树结构中添加多个根节点。当您要显示项目列表,但不显示单个主根节点时(例如在产品类别列表中),这一功能很有用。

每个节点都具有一个 Text 属性和一个 Value 属性。Text 属性的值显示在 TreeView 控件中,而 Value 属性则用于存储有关该节点的任何附加数据(例如传递给与节点相关联的回发事件的数据)。

单击 TreeView 控件的节点时,将引发选择事件(通过回发)或导航至其他页。未设置 NavigateUrl 属性时,单击节点将引发 SelectedNodeChanged 事件,您可以处理该事件,从而提供自定义的功能。每个节点还都具有 SelectAction 属性,该属性可用于确定单击节点时发生的特定操作,例如展开节点或折叠节点。若要在单击节点时不引发选择事件而导航至其他页,可将节点的 NavigateUrl 属性设置为除空字符串 ("") 之外的值。

节点的文本可以是两种模式之一:选择模式或导航模式。默认情况下,会有一个节点处于选定状态。若要使节点处于导航模式,请将节点的 NavigateUrl 属性设置为空字符串以外的值。当节点处于导航模式时,禁用该节点的所有选择事件。单击处于导航模式的节点可将用户链接到指定的 URL。可以选择设置 Target 属性以指定用来显示链接内容的窗口或框架。

此属性的值存储在视图状态中

下面的代码示例演示如何设置下一代码示例的框架

Code

下面的代码示例演示如何使用 NavigateUrl 属性指定单击节点时链接到的 URL。此示例用于在前一示例的框架集内显示一个目录。

 

 

Code

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 操作系统的计算机都包含此目录。这还将允许具有最低系统访问级别的用户安全地运行应用程序。

 

Code

如果传递了这个树节点,且它的类型被声明为 TreeNode 类,则需要将其强制转换为派生类。类型转换是从一种对象类型到另一种对象类型的显式转换。

Code

 

为 Windows 窗体 TreeView 控件设置图标

若要显示树节点旁边的图像,可将 ImageList 分配给父 TreeView 控件的 ImageList 属性,然后通过引用它在 ImageList 属性中的索引值来分配 Image。将 ImageIndex 属性设置为当 TreeNode 处于未选定状态时要显示的 Image 的索引值。同样,将SelectedImageIndex 属性设置为当 TreeNode 已选定时要显示的 Image 的索引值

  1. 设置 TreeView 控件的 ImageList 属性为想要使用的现有 ImageList 控件。

    这些属性可在设计器中使用“属性”窗口进行设置,也可在代码中设置。

    treeView1.ImageList = imageList1;

     

  2. 设置节点的 ImageIndex 和 SelectedImageIndex 属性。ImageIndex 属性确定正常和展开状态下的节点显示的图像, SelectedImageIndex 属性确定选定状态下的节点显示的图像。

    treeView1.SelectedNode.ImageIndex = 0;
    treeView1.SelectedNode.SelectedImageIndex 
    = 1;

     

posted @ 2009-07-08 23:32  Fskjb  阅读(20056)  评论(0编辑  收藏  举报
年年行好运