C#列表选择控件 TreeView

    TreeView用来显示信息的分级视图,类似于资源管理器的目录.


1.添加节点

    在treeview属性窗口中的Nodes集合中添加

    

    运行

    


2.应用

    在treeview属性窗口的CheckBoxes设为true

    


2.1 添加点击节点名称时候的事件AfterSelect

public partial class TreeView : Form
    {
        public TreeView()
        {
            InitializeComponent();
        }

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            MessageBox.Show(this.treeView1.SelectedNode.Text);//显示节点内容
            //MessageBox.Show(e.Node.Text);//同上
        }
    } 

    添加节点


    运行



2.2 添加选中选择框的事件AfterCheck

public partial class TreeView : Form
    {
        public TreeView()
        {
            InitializeComponent();
        }

        private void RefreshChildNode(TreeNode treeNode, bool c)
        {
            foreach (TreeNode node in treeNode.Nodes)
            {
                node.Checked = c;
                if(node.Nodes.Count>0)
                {
                    RefreshChildNode(node,c);
                }
            }
        }//递归选择孩子节点

        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Action != TreeViewAction.Unknown)
            {
                //只有当改变checked属性的时候才触发
                if (e.Node.Nodes.Count > 0)
                {
                    RefreshChildNode(e.Node, e.Node.Checked);
                }
            }
        }
    }

    运行,当选择了根节点1的时候,展开则子节点也随之选中。取消选中效果类似


    对于多选可用数据结果ArrayList保存多选的节点


2.3 展开折叠事件 AfterCollapse和AfterExpand

    添加imageList,并加入图像


    将imageList加入treeview作为资源,同时默认展示为文件图像,选择节点名称时候默认显示目录图像


运行



2.4 编辑节点内容

public partial class TreeView : Form
    {
        public TreeView()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //获取节点
            TreeNode selectedNode = treeView1.SelectedNode;
            if (selectedNode != null)
            {
                //判断是否是根节点
                if (selectedNode.Parent != null)
                {
                    //节点进入编辑状态
                    treeView1.LabelEdit = true;//这个很关键否则不能BeginEdit方法
                    selectedNode.BeginEdit();//开始编辑
                }
                else
                {
                    MessageBox.Show("选中的是根节点.");
                }
            }
            else
            {
                MessageBox.Show("没有节点被选中");
            }
        }

        private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
        {
            if (e.Label != null && e.Label.Length > 0)
            {
                //判断是否含有不合理的字符
                if (e.Label.IndexOfAny(new char[] { '@', '.', ',', '!' }) == -1)
                {
                    //编辑完成
                    e.Node.EndEdit(false);//保存退出
                }
                else
                {
                    e.CancelEdit = true;//取消此次编辑,这个很关键,因为不会发生修改
                    MessageBox.Show("无效的树节点标签.\n");
                    e.Node.EndEdit(true);//不保存退出编辑
                }
            }
            else
            {
                e.CancelEdit = true;//取消这次编辑效果
                MessageBox.Show("无效的树节点标签\n标签项不能为空");
                e.Node.EndEdit(true)//不保存退出编辑
            }
            this.treeView1.LabelEdit = false;
        }
    }

    运行,当编辑根节点的时候


    当改变子节点1.1为 @123的时候

    当不操作的时候


    正常操作该子节点1.1为123


2.5 拖拽操作

    首先将treeview属性窗口中的allowDrop设为true


public partial class TreeView : Form
    {
        public TreeView()
        {
            InitializeComponent();
        }

        private void treeView1_ItemDrag(object sender, ItemDragEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
                DoDragDrop(e.Item, DragDropEffects.Move);
        }

        private void treeView1_DragOver(object sender, DragEventArgs e)
        {
            Point point = treeView1.PointToClient(new Point(e.X, e.Y));
            //选鼠标所在节点
            treeView1.SelectedNode = treeView1.GetNodeAt(point);
        }

        private void treeView1_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = e.AllowedEffect;//允许拖拽
        }

        private void treeView1_DragDrop(object sender, DragEventArgs e)
        {
            //完成操作
            Point point = treeView1.PointToClient(new Point(e.X, e.Y));
            TreeNode node1 = treeView1.GetNodeAt(point);//获取鼠标释放处的位置节点
            TreeNode node2 = (TreeNode)e.Data.GetData(typeof(TreeNode));//获取拖拽的节点
            if (!node2.Equals(node1) && !HasChildNode(node2, node1))
            {
                //释放的位置节点不是拖拽的节点也不是拖拽节点的子节点
                if (e.Effect == DragDropEffects.Move)
                {
                    //移到操作
                    node2.Remove();
                    node1.Nodes.Add(node2);
                }
                else if (e.Effect == DragDropEffects.Copy)
                {
                    //复制操作
                    node1.Nodes.Add((TreeNode)node2.Clone());
                }
                node1.Expand();//释放节点处展开改节点
            }
        }

        private bool HasChildNode(TreeNode node1, TreeNode node2)
        {
            //node1是否是node2的父节点
            if (node2.Parent == null)
                return false;
            if (node2.Parent.Equals(node1))
                return true;
            return HasChildNode(node1, node2.Parent);
        }
    }

    结果,将treeView的父节点放在其子节点之下会没有效果。反之如下,将子节点1.1.2放入根节点1之下


    事实上,拖拽操作使得树变得很复杂,上面为了简单不允许由上往下拖拽

    TreeView中的数据一般来自数据库或者其他文件


猜你喜欢

转载自blog.csdn.net/whitenigt/article/details/80350109