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中的数据一般来自数据库或者其他文件