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

TreeView 控件的主要属性是 NodesSelectedNodeNodes 属性包含树视图中的顶级节点列表。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 对象具有可用于定位树视图的属性:FirstNode、LastNode、NextNode、PrevNode 和 Parent。Parent 属性值是当前节点的父节点。当前节点如果有子节点,则列在它的 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 的索引值。ImageIndexSelectedImageIndex 属性值所引用的图像是所有分配给 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,则若要防止该事件被多次引发,需为仅执行递归代码的事件处理程序添加逻辑。有关如何进行此操作的示例,请参见 AfterCheckBeforeCheck 事件的示例部分。

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

注意   在运行时设置 CheckBoxes、Scrollable、ImageIndexSelectedImageIndex 属性时,将重新创建 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 customer1 incustomerArray)
   {
      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 customer2 incustomerArray)
   {
      treeView1.Nodes.Add(new TreeNode(customer2.CustomerName));
      // Add a child treenode for each Order object in the current Customer object.
      foreach(Order order1 incustomer2.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 集合,可以使用以下属性值来实现:FirstNode、LastNode、NextNode、PrevNode、NextVisibleNode、PrevVisibleNode。将上述属性之一返回的 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.                 }

TreeView 控件相关推荐

  1. dev treeview控件_在Winform开发框架中使用DevExpress的TreeList和TreeListLookupEdit控件

    DevExpress提供的树形列表控件TreeList和树形下拉列表控件TreeListLookupEdit都是非常强大的一个控件,它和我们传统Winform的TreeView控件使用上有所不同,我一 ...

  2. C# 在DataGridView中,点击单元格调出 TreeView控件 或 ListBox控件

    1.调出 TreeView控件 或  ListBox控件 private void deductGrid1_CellClick(object sender, DataGridViewCellEvent ...

  3. 递归遍历文件夹,并添加到TreeView控件中

    遍历文件夹,并把所有节点增加到TreeView控件中,这里单独写成了一个静态类,传入根目录节点和指定的目录这两个参数即可,可以稍作扩展用于其他方案 View Code 1 using System; ...

  4. WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色

    WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色  在B/S开发中,对TreeView控件要改变当前选中节点的颜色比较方便,其有相应的SelectedNodeChanged事件 ...

  5. matlab treeview,treeview控件

    高分在线等:C#中如何给treeview控件上的节点前添比如有一treeview1控件,需要在其所有节点前均加一静态小图标(所有节点我也新手,正好刚用过这功能.如下: 1. 到工具箱中拖一个image ...

  6. C# 系统应用之TreeView控件 (一).显示树状磁盘文件目录及加载图标

    在C#系统应用毕设U盘防御软件中需要实现文件不可恢复的删除,首先需要实现类似于资源管理器的界面,通过TreeView控件显示"我的电脑"所有磁盘文件树状目录并加载相应图标.显示结果 ...

  7. TreeView控件的展开与折叠

    在窗体中添加一个TreeView控件,设置CheckBox属性为True,绑定数据 Archive jkj = new Archive();//自定义类         public void Bin ...

  8. 给TreeView控件绑定数据

    TreeView控件显示Node对象的等级体系结构,每个Node对象包含了一个标签和可选的点位图.TreeView控件通常用于显示文档头.索引中的条目.磁盘上的文件和目录或者可以显示为等级结构的各种其 ...

  9. 部门树形结构,使用Treeview控件显示部门

    部门树形结构.设计张部门表用于存储部门编码.名称.上级部门id,使用Treeview控件显示部门树,并实现部门增删改.移动.折叠等功能.特别提示,部门有层级关系,可用donetbar的adtree控件 ...

  10. TreeView控件应用--访问文件或文件夹(一)

    C#用TreeView访问文件或文件夹,通过递归,展开所有文件夹(类似资源管理器的树形窗体) 首先,算法是用递归算法,不断的递归文件.以此来遍历整个电脑的磁盘内容,过程也很简单.这种算法的时间复杂度太 ...

最新文章

  1. 不懂管理,你拿什么赢别人!商业奇才10句话,老板奉为管理圣经
  2. visual studio写python_微软发布Visual Studio的Python开发插件
  3. c语言矩阵乘法优化,c语言矩阵相乘
  4. docker镜像启动后端口号是多少_14,Docker容器必知必会,你会了吗?
  5. [转载]学习数据库分表和分库思想
  6. Yii调用参数配置文件params
  7. 我在阿里招前端,我该怎么帮你?
  8. 二叉树的前中后序遍历之迭代法(非统一风格迭代方式)
  9. jquery改变字符串中部分字符的颜色
  10. IJCAI 2021 | 腾讯和复旦联合出品:Adv-Makeup人脸黑盒攻击对抗算法
  11. CuteFTP Pro 8.3.4 最新破解绿色版
  12. Dubbo调优 -- 超时TimeOut
  13. 用计算机求算术平方根教案,人教版数学七年级下册-课题-用计算器求算术平方根 教案...
  14. 你为什么要离开上一家公司?
  15. python基础课程讲解基本语法常见运算符以及结构语句
  16. RAID超级简单的教程
  17. windows输入法输入英文字母中间有空格
  18. Linux内存管理(四十):Linux PSI 详解
  19. Excel中如何找出两列数据中相同的数据,并且进行同行显示
  20. BAPI_ALM_ORDER_MAINTAIN 修改维修工单组件示例

热门文章

  1. 用两条命令看出你买的H3C光模块是否是正品
  2. The release Method
  3. 博客导航——一站式搜索(所有博客的汇总帖)【微信开发】
  4. 网页使用百度地图后,只显示灰色框框(已解决)
  5. mac下实用的代码编辑器
  6. 华为AC忘记console密码
  7. 计算与推断思维 九、经验分布
  8. 架设局域网升级服务器 用WSUS打补丁
  9. 计算机打印机设备管理器在哪里,打印机驱动在电脑哪里
  10. 使用Chinese-Word-Vectors作为pytorch中的预训练向量