首页 > 技术文章 > treeview 控件使用和数据绑定

shaobing012 2015-10-14 16:16 原文

  一、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);
    }
}

  

 

推荐阅读