精华内容
参与话题
问答
  • TreeView控件实践

    2013-07-10 15:44:48
    TreeView控件可以通过HierarchicalDataTemplate 和 DataTemplate来自定义。1)HierarchicalDataTemplate用来支持HeaderedItemsControl,其中DataType指定当前的数据类型, 只有符合这个类型才使用...
    <?xml version="1.0" encoding="UTF-8"?>
    
    
    
    TreeView控件可以通过HierarchicalDataTemplate 和 DataTemplate来自定义。

    1)HierarchicalDataTemplate用来支持HeaderedItemsControl,其中DataType指定当前的数据类型, 只有符合这个类型才使用HierarchicalDataTemplate;ItemsSource用来指定ItemsHost;内部的自定义实现(TextBlock)指定当前数据类型如何渲染,注意:不是子节点。

    <HierarchicalDataTemplate DataType    = "{x:Type src:League}"
                                    ItemsSource = "{Binding Path=Divisions}">
            <TextBlock Text="{Binding Path=Name}"/>
          </HierarchicalDataTemplate>

    2)对于TreeView控件, 我们可以只指定一个HierarchicalDataTemplate, 而保证数据结构每层的ItemSource的类型名一样, 每层的数据层需要渲染的数据一样。
    public class Node
    {
         public string Name {get; set;}
         public string Id {get; set;}
         public List<Node> Nodes {get; set;}
    }


    <HierarchicalDataTemplate   ItemsSource = "{Binding Path=Nodes}">
            <TextBlock Text="{Binding Path=Name}"/>
          </HierarchicalDataTemplate>

    3)另外一种就是如1)所示, 我们可以针对每层的数据层指定HierarchicalDataTemplate, 

    <Window x:Class="SDKSample.Window1"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="HierarchicalDataTemplate Sample"
      xmlns:src="clr-namespace:SDKSample">
      <DockPanel>
        <DockPanel.Resources>
          <src:ListLeagueList x:Key="MyList"/>

          <HierarchicalDataTemplate DataType    = "{x:Type src:League}"
                                    ItemsSource = "{Binding Path=Divisions}">
            <TextBlock Text="{Binding Path=Name}"/>
          </HierarchicalDataTemplate>

          <HierarchicalDataTemplate DataType    = "{x:Type src:Division}"
                                    ItemsSource = "{Binding Path=Teams}">
            <TextBlock Text="{Binding Path=Name}"/>
          </HierarchicalDataTemplate>

          <DataTemplate DataType="{x:Type src:Team}">
            <TextBlock Text="{Binding Path=Name}"/>
          </DataTemplate>
        </DockPanel.Resources>

        <Menu Name="menu1" DockPanel.Dock="Top" Margin="10,10,10,10">
            <MenuItem Header="My Soccer Leagues"
                      ItemsSource="{Binding Source={StaticResource MyList}}" />
        </Menu>

        <TreeView>
          <TreeViewItem ItemsSource="{Binding Source={StaticResource MyList}}" Header="My Soccer Leagues" />
        </TreeView>

      </DockPanel>
    </Window>

    展开全文
  • TreeView控件

    热门讨论 2018-04-29 21:26:15
    在我们的开发中经常会遇到一些有树...TreeView控件支持数据绑定,也支持以编程的方式动态添加节点。在 TreeView控件中每个节点都是一个 TreeNode 对象,我们可以通过 TreeNode 对象的Nodes属性来添加其它的 TreeNod...

    在我们的开发中经常会遇到一些有树形层次关系的数据,比如显示无限级分类和显示某个文件下的所有文件及文件夹,对于这些带有树形层次关系的数据的显示用TreeView 控件是一个比较不错的选择。TreeView控件支持数据绑定,也支持以编程的方式动态添加节点。在 TreeView控件中每个节点都是一个 TreeNode 对象,我们可以通过 TreeNode 对象的Nodes属性来添加其它的 TreeNode 对象,使之成为这个 TreeNode 对象的子节点。TreeView对象有以下常见属性:


    属性名

    说明

    CheckedNodes

    获取选中了复选框的节点

    CollapseImageUrl

    节点折叠时的图象

    DataSource

    绑定到 TreeView 控件的数据源

    DataSourceID

    绑定到 TreeView 控件的数据源控件的 ID

    EnableClientScript

    是否允许客户端处理展开和折叠事件

    ExpandDepth

    第一次显示时所展开的级数

    ExpandImageUrl

    节点展开的时的图象

    NoExpandImageUrl

    不可折叠(即无字节点)的节点的图象

    PathSeparator

    节点之间的值的路径分隔符

    SelectedNode

    当前选中的节点

    SelectedValue

    当前选中的值

    ShowCheckBoxes

    是否在节点前显示复选框

    方法:在同一个asp.net文件夹下建一个xml文件和一个页面XML部分代码:

    <?xml version="1.0" encoding="utf-8" ?>
    <Area>
      <Province>
        <Provience iAreaID="1" cAreaName="北京市"/>
        <Provience iAreaID="2" cAreaName="上海市"/>
        <Provience iAreaID="3" cAreaName="成都市"/>
        <Provience iAreaID="4" cAreaName="德阳市"/>
        <Provience iAreaID="5" cAreaName="四川省"/>
        <City iAreaID="51" cAreaName="成都市"/>
        <City iAreaID="52" cAreaName="绵阳市"/>
        <City iAreaID="53" cAreaName="德阳市"/>
        <City iAreaID="54" cAreaName="南充市"/>
        <City iAreaID="55" cAreaName="遂宁市"/>
        <City iAreaID="56" cAreaName="攀枝花市"/>
      </Province>
        <Province iAreaID ="6" cAreaName="河北省">
          <City iAreaID ="61" cAreaName="石家庄市"/>
          <City iAreaID ="62" cAreaName="唐山市" />
        </Province>
        <Province iAreaID ="7" cAreaName="山西省">
          <City iAreaID ="71" cAreaName="太原市" />
          <City iAreaID ="72" cAreaName="大同市" />
        </Province>
      
    </Area>
    
    

    前端代码:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TreeView控件demo.aspx.cs" Inherits="复合控件和母版页.TreeView控件demo" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title>TreeView控件的例子</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:TreeView ID="treeAreaList" runat="server" AutoGenerateDataBindings="false"
                OnSelectedNodeChanged="Tree_SelectedNodeChanged"></asp:TreeView>
        </div>
        </form>
    </body>
    </html>
    

    后端代码:

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web.Security;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Xml;
    using System.Xml.XPath;
    
    namespace 复合控件和母版页
    {
        public partial class TreeView控件demo : System.Web.UI.Page
        {
            XmlDocument xmlDox;//声明一个xmlDox全局变量
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!Page.IsPostBack)
                {
                    MakeParentNode();
                }
            }
            #region 生成父节点
            /// <summary>
            /// 生成
            /// </summary>
            protected void MakeParentNode()
            {
                treeAreaList.Nodes.Clear();
                xmlDox = new XmlDocument();
                xmlDox.Load(Server.MapPath("area.xml"));//动态加载XML文档
                XmlNodeList nodeList = xmlDox.SelectSingleNode("Area").ChildNodes;//获取Area节点下所有子节点
                //定义Area节点
                TreeNode topNode = new TreeNode();//定义顶级节点
                topNode.Text = "area";
                //tn.Value=-1;
                topNode.Expanded = true;
                treeAreaList.Nodes.Add(topNode);//添加“区域”父节点
                XmlElement element = null;
                TreeNode treeNode = null;
                //遍历区域下的所有直辖省和直辖市
                foreach (XmlNode node in nodeList)
                {
                    element = (XmlElement)node;
                    treeNode = new TreeNode();
                    treeNode.Text = element.GetAttribute("cAreaName");//在控件上显示省或直辖市的名称
                    treeNode.Value = element.GetAttribute("iAreaID");//获取节点值
                    treeNode.Expanded = true;
                    topNode.ChildNodes.Add(treeNode);//将省或直辖市节点添加到顶级节点中
                    MakeChildNode(node.ChildNodes, treeNode);//通过递归将所有子节点添加到节点集合中
                }
            }
            #endregion
            #region 生成子节点
            /// <summary>
            /// 递归将子节点添加到当前节点下
            /// </summary>
            /// <param name="nodeList"></param>
            /// <param name="treeNode"></param>
            protected void MakeChildNode(XmlNodeList nodeList, TreeNode treeNode)
            {
                XmlElement element = null;
                TreeNode subTreeNode = null;
                //遍历省级节点下的所有市、市辖区
                foreach (XmlNode node in nodeList)
                {
                    element = (XmlElement)node;
                    subTreeNode = new TreeNode();
                    subTreeNode.Text = element.GetAttribute("cAreaName");//在树控件上显示市或市辖区的名称
                    subTreeNode.Value = element.GetAttribute("iAreaID");//这里设置节点value
                    subTreeNode.Expanded = true;
                    treeNode.ChildNodes.Add(subTreeNode);//将子节点添加到父节点下面
                    MakeChildNode(node.ChildNodes, subTreeNode);//递归调用本方法
                }
            }
            #endregion
            protected void Tree_SelectedNodeChanged(object sender, EventArgs e)
            {
                Response.Write("节点的值:" + treeAreaList.SelectedNode.Value + "<br/>");
                Response.Write("节点的路径:" + treeAreaList.SelectedNode.ValuePath + "<br/>");
                Response.Write("节点的数据路径:" + treeAreaList.SelectedNode.DataPath + "<br/>");
            }
        }
    }
    

    效果图:



    展开全文
  • TreeView 控件

    千次阅读 2005-12-08 15:08:00
    Windows 窗体 TreeView 控件以类似于在 Windows 资源管理器左窗格中显示文件和文件夹的方式显示节点的层次结构。每个节点可能包含称为子节点的其他节点。父节点或包含子节点的节点可以展开或折叠的方式显示。如果将...

    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 customer1 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 customer2 in customerArray)

       {

          treeView1.Nodes.Add(new TreeNode(customer2.CustomerName));

              

          // Add a child treenode for each Order object in the current Customer object.

          foreach(Order order1 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.                 }

    展开全文
  • TreeView 控件

    千次阅读 2006-12-12 11:42:00
    Windows 窗体 TreeView 控件以类似于在 Windows 资源管理器左窗格中显示文件和文件夹的方式显示节点的层次结构。每个节点可能包含称为子节点的其他节点。父节点或包含子节点的节点可以展开或折叠的方式显示。如果将...

    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 void FillMyTreeView()
     

     

       // Add orders to each Customer object in the ArrayList.
     

     

       // Display a wait cursor while the TreeNodes are being created.
     

     

       // Clear the TreeView each time the method is called.
     

     

       // Add a root TreeNode for each Customer object in the ArrayList.
     

     

       // Reset the cursor to the default for all controls.
     

     

       // Begin repainting the TreeView.
     

     

    备注

    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.                
     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     
    展开全文
  • Treeview控件

    2016-05-28 11:33:58
     创建一个如下的窗体,并在窗体上放置一个标签、一个treeviw控件。窗体打开时,动态为treeviw控件添加节点,选择某个节点后,标签上显示所选内容。 输入代码: using System; using System.Collections....
  • treeview控件

    2011-11-29 19:12:01
    treeview概述 自动数据绑定,该功能允许将控件的节点绑定到分层数据 通过与SiteMapdatasource控件集成提供对站点导航的支持 通过客户端到服务器的回调填充节点 能够在每个节点旁边显示复选框   针对TreeNodes,...
  • TreeView控件

    2007-08-31 15:10:00
    如何使用 .net 的TreeView控件 作者:幻想曲 时间: 2003-10-10 文档类型:原创 来自:蓝色理想 浏览统计 total:86910 | year:25286 | Quarter:5188 | Month:1686 | Week:142 | today:31
  • 重写TreeView控件

    2013-06-26 18:52:25
    重写TreeView控件,支持在节点后添加图片,Checkbox,Button等各种控件。
  • TreeView控件程序

    2010-08-10 11:20:45
    详细使用了C#中的TreeView控件,可以作为学习模板
  • TreeView控件使用

    2007-11-28 23:27:31
    TreeView控件使用,可以动态进行树图控制。
  • TreeView控件工具

    2017-06-07 02:18:38
    TreeView控件工具,test文件是测试网页。

空空如也

1 2 3 4 5 ... 20
收藏数 14,174
精华内容 5,669
关键字:

treeview