TreeView 控件

Windows 窗体 TreeView 控件以类似于在 Windows 资源管理器左窗格中显示文件和文件夹的方式显示节点的层次结构。每个节点可能包含称为子节点的其他节点。父节点或包含子节点的节点可以展开或折叠的方式显示。如果将树视图的 CheckBoxes 属性设置为 true,则在显示树视图时,节点旁边还可带有复选框。然后,通过将节点的 Checked 属性设置为 true false,就可以编程方式选定或清除节点。

TreeView控件的主要属性是 Nodes SelectedNodeNodes属性包含树视图中的顶级节点列表。SelectedNode属性设置当前选定节点。节点旁边可显示图标;从树视图的 ImageList 属性中命名的 ImageList 控件获取图像。ImageIndex属性为树视图中的节点设置默认图像。

使用 Windows 窗体 TreeView 控件添加和移除节点

因为 Windows 窗体 TreeView 控件以层次结构的方式显示节点,因此在添加节点时必须注意谁是它的父节点。

在设计器中添加或移除节点

1.             选择 TreeView 控件或将一个 TreeView 控件添加到窗体中。

2.             属性窗口中,单击 Nodes 属性旁的省略号 ()

显示出树节点编辑器

3.             若要添加节点,必须存在根节点;如果不存在根节点,必须先单击添加根按钮添加一个根节点。然后,就可通过选择根节点或任何其他节点并单击添加子级按钮来添加子节点。若要删除节点,请选择要删除的节点,然后单击删除按钮。

以编程方式添加节点

·                 使用树视图 Nodes 属性的 Add 方法。

·                        // C#

·                        // Adds new node as a child node of the currently selected node.

·                        TreeNode newNode = new TreeNode("Text for new node");

·                        treeView1.SelectedNode.Nodes.Add(newNode);

·                       

以编程方式移除节点

·                 使用树视图 Nodes 属性的 Remove 方法移除单个节点,或使用 Clear 方法清除所有节点。

·                        // Removes currently selected node, or root if nothing

·                        // is selected.

·                        treeView1.Nodes.Remove(treeView1.SelectedNode);

·                        // Clears all nodes.

·                        TreeView1.Nodes.Clear();

Windows 窗体 TreeView 控件设置图标

Windows 窗体 TreeView 控件可在每个节点旁显示图标。图标紧挨着节点文本的左侧。若要显示这些图标,必须使树视图与 ImageList 控件相关联。

在树视图中显示图像

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

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

' Visual Basic

TreeView1.ImageList = ImageList1

// C#

treeView1.ImageList = imageList1;

// C++

treeView1->ImageList = imageList1;

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

这些属性可在代码中设置,或在树节点编辑器中设置。若要打开树节点编辑器,请单击属性窗口中 Nodes 属性旁边的省略号按钮 ()

' Visual Basic

' (Assumes that ImageList1 contains at least two images and

' the TreeView control contains a selected image.)

TreeView1.SelectedNode.ImageIndex = 0

TreeView1.SelectedNode.SelectedImageIndex = 1

// C#

// (Assumes that imageList1 contains at least two images and

// the TreeView control contains a selected image.)

treeView1.SelectedNode.ImageIndex = 0;

treeView1.SelectedNode.SelectedImageIndex = 1;

// C++

// (Assumes that imageList1 contains at least two images and

// the TreeView control contains a selected image.)

treeView1->SelectedNode->ImageIndex = 0;

treeView1->SelectedNode->SelectedImageIndex = 1;

循环访问 Windows 窗体 TreeView 控件的所有节点

为了对节点值执行某种运算,查看 Windows 窗体 TreeView 控件中的每个节点有时很有用。利用递归过程(C# C++ 中为递归方法)可完成此操作,该过程循环访问每个树集合中的每个节点。

树视图中的每个 TreeNode 对象具有可用于定位树视图的属性:FirstNodeLastNodeNextNodePrevNode ParentParent属性值是当前节点的父节点。当前节点如果有子节点,则列在它的 Nodes 属性中。TreeView控件本身具有 TopNode 属性,该属性是整个树视图的根节点。

循环访问 TreeView 控件的所有节点

1.            创建测试每个节点的递归过程(C# C++ 中为递归方法)。

2.            调用该过程。

下例显示如何打印每个 TreeNode 对象的 Text 属性:

' Visual Basic

Private Sub PrintRecursive(ByVal n As TreeNode)

   System.Diagnostics.Debug.WriteLine(n.Text)

   MessageBox.Show(n.Text)

   Dim aNode As TreeNode

   For Each aNode In n.Nodes

      PrintRecursive(aNode)

   Next

End Sub

' Call the procedure using the top nodes of the treeview.

Private Sub CallRecursive(ByVal aTreeView As TreeView)

   Dim n As TreeNode

   For Each n In aTreeView.Nodes

      PrintRecursive(n)

   Next

End Sub

// C#

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);

   }

}

// C++

private:

   void PrintRecursive(TreeNode * treeNode)

   {

      // Print the node.

      System::Diagnostics::Debug::WriteLine(treeNode->Text);

      MessageBox::Show(treeNode->Text);

      // Print each node recursively.

      IEnumerator * myNodes = (__try_cast<IEnumerable*>

         (treeNode->Nodes))->GetEnumerator();

      try

      {

         while (myNodes->MoveNext())

         {

            TreeNode * tn = __try_cast<TreeNode*>(myNodes->Current);

            PrintRecursive(tn);

         }

      }

      __finally

      {

         IDisposable * disposable = dynamic_cast<System::IDisposable*>

            (myNodes);

         if (disposable != 0) disposable->Dispose();

      }

   }

   // Call the procedure using the TreeView.

   void CallRecursive(TreeView * treeView)

   {

      // Print each node recursively.

      TreeNodeCollection * nodes = treeView->Nodes;

      IEnumerator * myNodes = (__try_cast<IEnumerable*>

         (nodes))->GetEnumerator();

      try

      {

         while (myNodes->MoveNext())

         {

            TreeNode * n = __try_cast<TreeNode*>(myNodes->Current);

            PrintRecursive(n);

         }

      }

      __finally

      {

         IDisposable * disposable = dynamic_cast<System::IDisposable*>

            (myNodes);

         if (disposable != 0) disposable->Dispose();

      }

   }

备注

显示标记项的分层集合,每个标记项用一个 TreeNode 来表示。

有关此类型所有成员的列表,请参阅 TreeView 成员

Nodes 集合包含分配给 TreeView 控件的所有 TreeNode 对象。此集合中的树节点称作根树节点。随后添加到根树节点上的任何树节点称作子节点。由于每个 TreeNode 都可以包含其他 TreeNode 对象的集合,您可能会在循环访问集合时觉得很难确定自己在树结构中的位置。您可以使用 PathSeparator 字符串值来分析 TreeNode.FullPath 字符串,以确定 TreeNode 标签的起始和终止位置。

若要显示树节点旁的图像,可以将一个 ImageList 对象分配给 ImageList 属性,然后通过引用 Image ImageList 中的索引值来分配该 Image。将 ImageIndex 属性设置为当树节点未选定时所显示的 Image 的索引值。同样,将 SelectedImageIndex 属性设置为当树节点选定时所显示的 Image 的索引值。ImageIndex SelectedImageIndex 属性值所引用的图像是所有分配给 Nodes 集合的树节点显示的默认图像。每个树节点都可以通过设置 TreeNode.ImageIndex TreeNode.SelectedImageIndex 属性来重写默认图像。

树节点可以展开,以显示下一级子树节点。用户可以在 TreeNode 旁显示加号 (+) 按钮时通过单击加号 (+) 按钮来展开 TreeNode,或者可以通过调用 TreeNode.Expand 方法来展开 TreeNode。若要展开 Nodes 集合中的所有子树节点级别,请调用 ExpandAll 方法。若要折叠子 TreeNode 级别,可以调用 TreeNode.Collapse 方法,也可以在 TreeNode 旁显示减号 (-) 按钮时按减号 (-) 按钮。还可以通过调用 TreeNode.Toggle 方法在展开和折叠状态之间切换。

树节点可以选择性地显示复选框。若要显示复选框,请将 TreeView CheckBoxes 属性设置为 true。对于处于选中状态的树节点,Checked 属性设置为 true

注意    BeforeCheck AfterCheck 事件内设置 TreeNode.Checked 属性将导致该事件被多次引发并可能产生意外行为。例如,您可以在递归更新子节点时在事件处理程序中设置 Checked 属性,以便用户不必逐个展开并选中每个节点。如果未将 TreeViewEventArgs Action 属性设置为 TreeViewAction.Unknown,则若要防止该事件被多次引发,需为仅执行递归代码的事件处理程序添加逻辑。有关如何进行此操作的示例,请参见 AfterCheck BeforeCheck 事件的示例部分。

通过设置 TreeView 控件的一些显示和样式属性,可以更改此控件的外观。如果将 ShowPlusMinus 设置为 true,则会分别在每个可展开或折叠的 TreeNode 对象旁显示加号或减号按钮。如果将 ShowRootLines 属性设置为 trueTreeView则会显示所有根树节点之间的连线。通过将 ShowLines 属性设置为 true,可以显示子树节点与其根节点之间的连线。如果将 HotTracking 属性设置为 true,那么当鼠标指针移过树节点标签时,树节点标签的外观将发生变化。如果启用热跟踪,树节点标签将具有超级链接的外观。

注意   在运行时设置 CheckBoxesScrollableImageIndex SelectedImageIndex 属性时,将重新创建 TreeView 句柄(请参见 Control.RecreateHandle)以更新控件的外观。这将折叠除选定的 TreeNode 之外的所有树节点。

下面的示例在 TreeView 控件中显示客户信息。根树节点显示客户名称,子树节点显示分配给每个客户的订单编号。在本示例中,显示 1,000 个客户,每个客户有 15 个订单。使用 BeginUpdate 方法和 EndUpdate 方法可取消重新绘制 TreeView,在 TreeView 创建和绘制 TreeNode 对象时,显示等待 Cursor。本示例假定有一个Customer对象,它可以存放Order对象的集合。还假定在应用程序目录中有一个名为MyWait.cur的光标文件,并已在 Form 上创建了 TreeView 控件的一个实例。 // Create a new ArrayList to hold the Customer objects.

 
private ArrayList customerArray = new ArrayList(); 

 

private void FillMyTreeView()
 
{
   // Add customers to the ArrayList of Customer objects.
   for(int x=0; x<1000; x++)
   {
      customerArray.Add(new Customer("Customer" + x.ToString()));
   }

 

   // Add orders to each Customer object in the ArrayList.
 
   foreach(Customer customer
   
   1 in customerArray)
   {
      for(int y=0; y<15; y++)
      {
         customer1.CustomerOrders.Add(new Order("Order" + y.ToString()));    
      }
   }

 

   // Display a wait cursor while the TreeNodes are being created.
 
   Cursor.Current = new Cursor("MyWait.cur");
        
   // Suppress repainting the TreeView until all the objects have been created.
   treeView1.BeginUpdate();

 

   // Clear the TreeView each time the method is called.
 
   treeView1.Nodes.Clear();

 

   // Add a root TreeNode for each Customer object in the ArrayList.
 
   foreach(Customer customer
   
   2 in customerArray)
   {
      treeView1.Nodes.Add(new TreeNode(customer2.CustomerName));
          
      // Add a child treenode for each Order object in the current Customer object.
      foreach(Order order
   
   1 in customer2.CustomerOrders)
      {
         treeView1.Nodes[customerArray.IndexOf(customer2)].Nodes.Add(
           new TreeNode(customer2.CustomerName + "." + order1.OrderID));
      }
   }

 

   // Reset the cursor to the default for all controls.
 
   Cursor.Current = Cursors.Default;

 

   // Begin repainting the TreeView.
 
   treeView1.EndUpdate();
}

 

备注

Nodes 集合包含所有分配给当前 TreeNode 的子 TreeNode 对象。您可以添加、移除或克隆 TreeNode;当这样做时,将添加、删除或克隆所有子树节点。每个 TreeNode 都可以包含其他 TreeNode 对象的集合。这种情况下,当您循环访问集合时,将很难确定自己是否在 TreeView 中。要确定您在树结构中的位置,可使用 FullPath 属性。FullPath字符串可以使用 PathSeparator 字符串值来进行分析,以确定 TreeNode 标签的起始和终止位置。

TreeNode标签通过显式设置 Text 属性来进行设置。另一种替代方法是使用 TreeNode 构造函数之一创建树节点,并使其具有表示 Text 属性的字符串参数。如果显示标签,则标签显示在 TreeNode 图像的旁边。

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

若要选择特定的树节点并循环访问 Nodes 集合,可以使用以下属性值来实现:FirstNodeLastNodeNextNodePrevNodeNextVisibleNodePrevVisibleNode。将上述属性之一返回的 TreeNode 对象分配给 TreeView.SelectedNode 属性,以便在 TreeView 控件中选择该节点。

树节点可以展开,以显示下一级子树节点。用户可以在 TreeNode 旁显示加号 (+) 按钮时通过单击加号 (+) 按钮来展开 TreeNode,或者可以通过调用 Expand 方法来展开 TreeNode。若要展开 Nodes 集合中的所有子树节点级别,请调用 ExpandAll 方法。若要折叠子 TreeNode 级别,可以调用 Collapse 方法,也可以在 TreeNode 旁显示减号 (-) 按钮时按减号 (-) 按钮。还可以通过调用 Toggle 方法使 TreeNode 在展开和折叠状态之间切换。

树节点可以选择性地显示复选框。若要显示复选框,请将 TreeView CheckBoxes 属性设置为 true。对于处于选中状态的树节点,Checked 属性设置为 true

确定单击了哪个 TreeView 节点(Windows 窗体)

使用 Windows 窗体 TreeView 控件时,一个常见任务是确定单击了哪个节点并相应地予以响应。

确定单击了哪个 TreeView 节点

1.            使用 EventArgs 对象返回对已单击的节点对象的引用。

2.            通过检查 TreeViewEventArgs 类(它包含与事件有关的数据),确定单击了哪个节点。

3.                 // C#

4.                 protected void treeView1_AfterSelect (object sender,

5.                 System.Windows.Forms.TreeViewEventArgs e)

6.                 {

7.                    // Determine by checking the Text property.

8.                    MessageBox.Show(e.Node.Text);

9.                
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值