treeview 控件使用和数据绑定

  一、TreeViewe 是由多个类来定义的,TreeView组件是由命名空间“System.Windows.Froms”中的“TreeView”类来定义的,而其中的节点(即Node),是由命名空间“System.Windows.Froms”中的“TreeNode”来定义的。所以在程序中创建一个TreeVirew对象,其实只是创建了一个可以防止检点的“容器”。而在这个容器中加入一个节点,其实就是加入了从“TreeNode”类中创建的一个节点对象;同样删除一个节点,也就是删除一个“TreeNode”对象。

  二、 C#操作TreeView组件中的一些常用方法以及具体实现:

  可以总结为三种基本操作:加入子节点、加入兄弟节点和删除节点

  1.加入子节点

  所谓子节点,就是处于选定节点的下一级节点。加入子节点的具体过程是:首先要在TreeView组件中定位要加入的子节点的位置,然后创建一个节点对象,然后利用TreeVeiw类中对节点的加入方法(即:Add ( )方法),加入此节点对象。下面就是在treeView1组件中加入一个子节点的具体代码:

 //首先判断是否选定组件中的位置
        if (treeView1.SelectedNode == null)
        {
            MessageBox.Show("请选择一个节点", "提示信息",
            MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        else
        {
            //创建一个节点对象,并初始化
            TreeNode tmp;
            tmp = new TreeNode("节点名称");
            //在TreeView组件中加入子节点
            treeView1.SelectedNode.Nodes.Add(tmp);
            treeView1.SelectedNode = tmp;
            treeView1.ExpandAll();
        }

  2.加入兄弟节点

  

  所谓兄弟节点,就是在选定的节点的平级的节点。加入兄弟节点的方法和加入子节点的方法基本一致,只是在最后的实现方法上有着略微的区别。加入兄弟节点的具体步骤,首先也是要确定要加入的兄弟节点所处的位置,接着定义一个节点对象,最后调用TreeView类中对兄弟节点加入的方法,加入此节点对象。加入兄弟节点和加入子节点的最大区别就在于这最后一步。希望读者能够注意。下面是在TreeView组件加入一个兄弟节点的具体代码:

//首先判断是否选定组件中节点的位置
        if (treeView1.SelectedNode == null)
        {
            MessageBox.Show("请选择一个节点", "提示信息",
            MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        else
        {
            //创建一个节点对象,并初始化
            TreeNode tmp;
            tmp = new TreeNode(textBox1.Text);
            //在TreeView组件中加入兄弟节点
            treeView1.SelectedNode.Parent.Nodes.Add(tmp);
            treeView1.ExpandAll();
        }

  3.删除节点

  删除节点就是删除TreeView组件中选定的节点,删除节点可以是子节点,也可以是兄弟节点,但无论节点的性质如何,必须保证要删除的节点没有下一级节点,否则必须先删除此节点中的所有下一级节点,然后再删除此节点。删除节点比起上面的二个操作要显得略微简单,具体方法是:首先判断要删除的节点是否存在下一级节点,如果不存在,就调用TreeView类中的Remove ( )方法,就可以删除节点了。下面是删除TreeView组件中节点的具体代码:

//判断选定的节点是否存在下一级节点
if ( treeView1.SelectedNode.Nodes.Count == 0 )
//删除节点
treeView1.SelectedNode.Remove ( ) ;
else
MessageBox.Show ( "请先删除此节点中的子节点!" , "提示信
息" , MessageBoxButtons.OK ,
MessageBoxIcon.Information ) ;

  4.TreeView组件的一些其他常用操作:

    < I > .展开所有节点:

    要展开TreeView组件中的所有节点,首先就要把选定的节点指针定位在TreeView组件的根节点上,然后调用选定组件的ExpandAll方法就可以了,下面是具体代码:

//定位根节点
treeView1.SelectedNode = treeView1.Nodes [ 0 ] ;
//展开组件中的所有节点
treeView1.SelectedNode.ExpandAll ( ) ;

    < II > .展开选定节点的下一级节点:

    由于只是展开下一级节点,所以就没有必要用ExpandAll ( )方法了。展开下一级节点只需要调用Expand ( )方法就可以了,下面是具体的实现代码:

treeView1.SelectedNode.Expand ( ) ;

    

    < III > .折叠所有节点:

      折叠所有节点和展开所有节点是一组互操作,具体实现的思路也大致相同,折叠所有节点也是首先要把选定的节点指针定位在根节点上,然后调用选定组件的Collapse ( )就可以了,下面是具体的实现代码:

//定位根节点
treeView1.SelectedNode = treeView1.Nodes [ 0 ] ;
//折叠组件中所有节点
treeView1.SelectedNode.Collapse ( ) ;

  三、实例

using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows .Forms ;
using System.Data ;
namespace 全面掌握TreeView组件的使用方法
{
    /// Form1 的摘要说明。
    public class Form1 : Form
    {
        private TreeView treeView1 ;
        private Button button1 ;
        private Button button2 ;
        private Button button3 ;
        private MenuItem menuItem2 ;
        private MenuItem menuItem3 ;
        private MenuItem menuItem4 ;
        private ContextMenu contextMenu1 ;
        private TextBox textBox1 ;
        private Label label1 ;
        /// 必需的设计器变量。
        private System.ComponentModel.Container components = null ;
        public Form1 ( )
        {
            //初始化窗体中的组件
            InitializeComponent ( ) ;
        }
        /// 清理所有正在使用的资源。
        protected override void Dispose ( bool disposing )
        {
            if ( disposing )
            {
                if ( components != null )
                {
                    components.Dispose ( ) ;
                }
            }
            base.Dispose ( disposing ) ;
        }
        private void InitializeComponent ( )
        {
          //初始化代码(略)
        }
        [ STAThread ]
        static void Main ( )
        {
            Application.Run ( new Form1 ( ) ) ;
        }
        private void AddChildNode ( )
        {
            //首先判断是否选定组件中的位置
            if ( treeView1.SelectedNode == null )
            {
                MessageBox.Show ( "请选择一个节点" , "提示信息" ,
                MessageBoxButtons.OK , MessageBoxIcon.Information ) ;
            }
            else
            {
                if ( textBox1.Text != "" )
                {
                    //创建一个节点对象,并初始化
                    TreeNode tmp ;
                    tmp = new TreeNode ( textBox1.Text ) ;
                    //在TreeView组件中加入子节点
                    treeView1.SelectedNode.Nodes.Add ( tmp ) ;
                    treeView1.SelectedNode = tmp ;
                    treeView1.ExpandAll ( ) ;
                }
                else
                {
                    MessageBox.Show ( "TextBox组件必须填入节点名称!" , "提示信息" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;
                    return ;
                }
            }
        }
        private void AddParent ( )
        {
            //首先判断是否选定组件中节点的位置
            if ( treeView1.SelectedNode == null )
            {
                MessageBox.Show ( "请选择一个节点" , "提示信息" ,  MessageBoxButtons.OK , MessageBoxIcon.Information ) ;
            }
            else
            {
                if ( textBox1.Text != "" )
                {
                    //创建一个节点对象,并初始化
                    TreeNode tmp ;
                    tmp = new TreeNode ( textBox1.Text ) ;
                    //在TreeView组件中加入兄弟节点
                    treeView1.SelectedNode.Parent.Nodes.Add ( tmp ) ;
                    treeView1.ExpandAll ( ) ;
                }
                else
                {
                    MessageBox.Show ( "TextBox组件必须填入节点名称!" , "提示信息" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;
                    return ;
                }
            }
            TreeNode tnode = new TreeNode ( textBox1.Text ) ;
        }
        private void treeView1_MouseDown ( object sender ,
        MouseEventArgs e )
        {
            if ( e.Button == MouseButtons.Right )
            contextMenu1.Show ( this , new Point ( e.X , e.Y ) ) ;
        }
        private void button1_Click ( object sender ,
        System.EventArgs e )
        {
            treeView1.SelectedNode.Expand ( ) ;
        }
        private void menuItem2_Click ( object sender ,
        System.EventArgs e )
        {
            AddChildNode ( ) ;
        }
        private void menuItem3_Click ( object sender ,
        System.EventArgs e )
        {
            AddParent ( ) ;
        }
        private void menuItem4_Click ( object sender ,
        System.EventArgs e )
        {
            //判断选定的节点是否存在下一级节点
            if ( treeView1.SelectedNode.Nodes.Count == 0 )
            //删除节点
            treeView1.SelectedNode.Remove ( ) ;
            else
            MessageBox.Show ( "请先删除此节点中的子节点!" , "提示信
            息" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;
        }
        private void button2_Click ( object sender ,
        System.EventArgs e )
        {
            //定位根节点
            treeView1.SelectedNode = treeView1.Nodes [ 0 ] ;
            //展开组件中的所有节点
            treeView1.SelectedNode.ExpandAll ( ) ;
        }
        private void button3_Click ( object sender ,
        System.EventArgs e )
        {
            //定位根节点
            treeView1.SelectedNode = treeView1.Nodes [ 0 ] ;
            //折叠组件中所有节点
            treeView1.SelectedNode.Collapse ( ) ;
        }
    }
}

  四、数据绑定

  默认展开树的级别;0是不展开;1是展开一级;

  1.递归法

public partial class _Default : System.Web.UI.Page
{
    private void LoadTree(TreeNode parentNode)
    {
        List<ChinaStates> list = new chinabf().selectByCode(parentNode.Value);
        if (list.Count == 0)
        {
            return;
        }
        foreach (ChinaStates item in list)
        {
            TreeNode childNode = new TreeNode();
            childNode.Text = item.AreaName;
            childNode.Value = item.AreaCode;
            parentNode.ChildNodes.Add(childNode);
            LoadTree(childNode);
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        TreeNode root = new TreeNode();
        root.Text = "中国";
        root.Value = "0001";
        TreeView1.Nodes.Add(root);
        LoadTree(root);
    }
}

  2.for嵌套

public void treeBind()
{

    TreeNode root = new TreeNode();
    root.Text = "汉企数据通软件有限公司";
    root.Value = "H001";
    root.SelectAction = TreeNodeSelectAction.None;
    TreeView1.Nodes.Add(root);
    List<Department> list = new Function().SelectPart();
    List<Worker> data=new List<Worker>();
    foreach (Department item in list)
    {
        TreeNode firstNode = new TreeNode();
        firstNode.Text = item.Department1;
        firstNode.Value = item.DepartCode;
        firstNode.SelectAction = TreeNodeSelectAction.None;
        root.ChildNodes.Add(firstNode);
        List<Worker>arr= new Function().SelectWorker(item.Department1);
        foreach (Worker workers in arr)
        {
            TreeNode child = new TreeNode();
            child.Text = workers.Wname;
            child.Value = workers.Wid.ToString();
            child.SelectAction = TreeNodeSelectAction.None;
            firstNode.ChildNodes.Add(child);
        }
    }
}

  3.遍历所有子节点,找出选中项

protected void Button1_Click(object sender, EventArgs e)
{
    List<TreeNode> listNodes = new List<TreeNode>();
    foreach (TreeNode node in TreeView1.Nodes)
    {
        if (node != null)
        {
            FindCheckNode(node, listNodes);
        }
        else
        {
            return;
        }
    }
}

private void FindCheckNode(TreeNode node, List<TreeNode> listNodes)
{
    if (node.Checked)
    {
        listNodes.Add(node);
    }

    foreach (TreeNode childnode in node.ChildNodes)
    {

        FindCheckNode(childnode, listNodes);
    }
}

  

时间: 2024-11-09 01:38:52

treeview 控件使用和数据绑定的相关文章

WPF中TreeView控件数据绑定和后台动态添加数据

数据绑定: TreeView数据绑定需要使用层次结构数据模板(HierarchicalDataTemplate)来显示分层数据.XAML代码如下: <TreeView Name="chapterTree" Grid.Column="0"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Path=ChildNodes}"&

HTTP模拟工具【C#/Winform源码】、Json绑定TreeView控件、使用了MetroModernUI、RestSharp、Dapper.Net、Newtonsoft.Json、SmartThreadPool这几个主要开源框架

HTTP模拟工具 开发语言:C#/Winform开发工具:Visual Studio 2017数据库:   SQLite使用框架:界面-MetroModernUI              Http请求-RestSharp              ORM-Dapper.Net              Json解析-Newtonsoft.Json              多线程-SmartThreadPool本来打算试一下Dapper.Net扩展框架-DapperExtensions,用了有

WPF 将数据源绑定到TreeView控件出现界面卡死的情况

首先来谈一下实现将自定义的类TreeMode绑定到TreeView控件上的一个基本的思路,由于每一个节点都要包含很多自定义的一些属性信息,因此我们需要将该类TreeMode进行封装,TreeView的每一个节点的类型都是TreeMode,我们还定义一些Children属性,Parent属性用于定义当前节点的子节点和父节点,当然还定义了一些常见的Name.ToolTip.ID.IsExpand.IsChecked(主要是在每一个节点前面添加了一个CheckBox)等属性,另外的一些属性就是具体需要

Win32中TreeView控件的使用方法,类似于资源管理器中文件树形显示方式

首先是头文件,内容如下: #include <tchar.h> #include "..\CommonFiles\CmnHdr.h" #include <Windows.h> #include <WindowsX.h> #include <CommCtrl.h> #include "resource.h" #pragma comment (lib,"comctl32.lib") BOOL InitT

WinForms中TreeView控件的扩展与使用

EXE文件方便大家测试   源码下载 TreeView控件非常的好用,在我的公文系统中,使用TreeView控件选择接收公文的人员,支持单选,可多选 现提取出来,方便大家使用 涉及到的知识点 1:从Xml文件中加载内容显示到TreeView控件中 <?xml version="1.0" encoding="utf-8"?> <根目录> <组 名称="校长" 用户ID="1000"> <

【ASP.net控件】DropDownList数据绑定一个小bug

绑定数据出现这种情况,明明在第一项插入了一条数据,却始终在DropDownList中没有显示出来. 代码如下: if (!IsPostBack) { //绑定城市 DataTable dtCity = new HighSearch().GetCitySelect(); DropDownList1.DataSource = dtCity; DropDownList1.DataValueField = "citycode"; DropDownList1.DataTextField = &q

ASP.NET - TreeView控件,只操作最后一级节点

效果: 绑定TreeView控件:http://www.cnblogs.com/KTblog/p/4792302.html 主要功能: 点击节点的时候,只操作最后一级的节点,其他节点跳过不执行代码. 代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Data; 4 using System.Data.SqlClient; 5 using System.Web.UI.WebControls; 6 7 nam

在工作表左侧中添加TreeView控件

开发环境基于VSTO:visual studio 2010,VB .Net,excel 2007,文档级别的定制程序. 需求是在sheet的左侧停靠System.Windows.Forms.TreeView控件,实现类似资源浏览器的效果,另外,tree节点使用自定义的图标,支持复选框. 首先准备好树节点的图标,使用visual studio 2010自带的图标可以省去很多麻烦(在安装目录\Common7\VS2010ImageLibrary).我挑选了4个16x16大小的图标拷贝到vsto工程下

将MenuStrip控件中的信息添加到TreeView控件中【转载】

本文详细介绍怎样将MenuStrip控件中的信息添加到TreeView控件中 首先在WinForm窗体中添加一个MenuStrip控件和TreeView控件,根据个人的爱好把控件布局好后.在窗体的加载事件中(根据自己的情况而定)添加如下的代码: /// <summary>   /// 窗体加载时事件   /// </summary>   /// <param name="sender"></param>   /// <param n