【问题标题】:Dynamic Tree in C# [closed]C# 中的动态树 [关闭]
【发布时间】:2016-06-25 03:20:03
【问题描述】:

任何人都可以帮助我在 c# 中执行此操作并允许用户添加或删除节点,或者是否有任何库。 谢谢

【问题讨论】:

    标签: c# winforms tree


    【解决方案1】:

    您可以创建一个继承面板的类,然后创建一个不可见的 TreeView(用于存储数据)并覆盖 OnPaint。下面是一些示例代码,它会生成一些带有文本的圆圈,但它们之间没有线条。此外,绘制子节点的部分不会生成超过四行,但可以修改以生成更多。

    代码:

    using System;
    using System.Linq;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Collections.Generic;
    
    public class BinaryTreeView : Panel
    {   
        public BinaryTreeView()
        {
            this.Location = new Point(2, 2);
            this.Size = new Size(500, 400);
            this.BackColor = Color.White;
            this.Font = new Font(this.Font.Name, 21f, FontStyle.Bold);
        }
    
        public void AddParent(string nodeName)
        {
            binaryTreeViewData.Nodes.Add(new TreeNode() { Name = nodeName });
            this.Refresh();
        }
    
        public void Add(string nodeName, string parentNode)
        {
            try { binaryTreeViewData.Nodes.Find(parentNode, true)[0].Nodes.Add(new TreeNode() { Name = nodeName }); } catch { }
            this.Refresh();
        }
    
        public void Remove(string nodeName)
        {
            // find and remove code.
            this.Refresh();
        }
    
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
    
            List<TreeNode> childNodes = new List<TreeNode>();
    
            for (int i = (binaryTreeViewData.Nodes.Count - 1); i > -1; i--)
            {
                Point nodePos = new Point(((this.Width - (55 * binaryTreeViewData.Nodes.Count)) / 2) + (i * 55), 5);
                e.Graphics.DrawEllipse(new Pen(new SolidBrush(Color.Black), 3), new Rectangle(nodePos.X, nodePos.Y, 50, 50));
                e.Graphics.DrawString(binaryTreeViewData.Nodes[i].Name, this.Font, new SolidBrush(this.ForeColor), nodePos.X + 11, nodePos.Y + 9);
    
                foreach (TreeNode childNode in binaryTreeViewData.Nodes[i].Nodes)
                {
                    childNodes.Add(childNode);
                }
            }
    
            // Child node drawing part.
            List<TreeNode> childNodes2 = new List<TreeNode>();
            childNodes.Reverse();
    
            for (int i = (childNodes.Count - 1); i > -1; i--)
            {
                Point nodePos = new Point(((this.Width - (55 * childNodes.Count)) / 2) + (i * 55), 65);
                e.Graphics.DrawEllipse(new Pen(new SolidBrush(Color.Black), 3), new Rectangle(nodePos.X, nodePos.Y, 50, 50));
                e.Graphics.DrawString(childNodes[i].Name, this.Font, new SolidBrush(this.ForeColor), nodePos.X + 11, nodePos.Y + 9);
    
                foreach (TreeNode childNode in childNodes[i].Nodes)
                {
                    childNodes2.Add(childNode);
                }
            }
    
            List<TreeNode> childNodes3 = new List<TreeNode>();
            childNodes2.Reverse();
    
            for (int i = (childNodes2.Count - 1); i > -1; i--)
            {
                Point nodePos = new Point(((this.Width - (55 * childNodes2.Count)) / 2) + (i * 55), 125);
                e.Graphics.DrawEllipse(new Pen(new SolidBrush(Color.Black), 3), new Rectangle(nodePos.X, nodePos.Y, 50, 50));
                e.Graphics.DrawString(childNodes2[i].Name, this.Font, new SolidBrush(this.ForeColor), nodePos.X + 11, nodePos.Y + 9);
    
                foreach (TreeNode childNode in childNodes2[i].Nodes)
                {
                    childNodes3.Add(childNode);
                }
            }
    
            childNodes3.Reverse();
    
            for (int i = (childNodes3.Count - 1); i > -1; i--)
            {
                Point nodePos = new Point(((this.Width - (55 * childNodes3.Count)) / 2) + (i * 55), 185);
                e.Graphics.DrawEllipse(new Pen(new SolidBrush(Color.Black), 3), new Rectangle(nodePos.X, nodePos.Y, 50, 50));
                e.Graphics.DrawString(childNodes3[i].Name, this.Font, new SolidBrush(this.ForeColor), nodePos.X + 11, nodePos.Y + 9);
            }
        }
    
        private TreeView binaryTreeViewData = new TreeView();
    }
    

    用法:

    BinaryTreeView BinaryTreeViewExample = new BinaryTreeView();
    BinaryTreeViewExample.AddParent("A");
    
    BinaryTreeViewExample.Add("D", "A");
    BinaryTreeViewExample.Add("J", "D");
    BinaryTreeViewExample.Add("O", "J");
    BinaryTreeViewExample.Add("N", "J");
    BinaryTreeViewExample.Add("I", "D");
    BinaryTreeViewExample.Add("H", "D");
    
    BinaryTreeViewExample.Add("C", "A");
    BinaryTreeViewExample.Add("G", "C");
    BinaryTreeViewExample.Add("M", "G");
    BinaryTreeViewExample.Add("L", "G");
    
    BinaryTreeViewExample.Add("B", "A");
    BinaryTreeViewExample.Add("F", "B");
    BinaryTreeViewExample.Add("E", "B");
    BinaryTreeViewExample.Add("K", "E");
    
    ...Controls.Add(BinaryTreeViewExample);
    

    结果:

    注意:你必须反向添加元素,因为绘图功能是反向绘制节点。

    【讨论】:

    • 绝妙的答案
    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2010-10-28
    相关资源
    最近更新 更多