之前写过NetronLight开源框架

C#使用开源框架NetronLight绘制流程图-CSDN博客

我们这里将TreeView树图的节点内容展示到NetronLight图表中,按照树的层次【深度Level】展示

新建窗体应用程序ShowTreeNodeToDiagram,将默认的Form1重命名为FormShowNode,

右键解决方案ShowTreeNodeToDiagram,添加→现有项目,将NetronLight添加到项目中。

右键项目ShowTreeNodeToDiagram,添加引用,引用项目NetronLight

修改NetronLight.GraphControl 控件增加【连线集合】属性:

        /// <summary>/// Gets or sets the collection of connections on the canvas/// </summary>public ConnectionCollection Connections{get { return connections; }set { connections = value; }}

 窗体FormShowNode 设计器如下图:

窗体设计器程序如下:

FormShowNode.Designer.cs 文件


namespace ShowTreeNodeToDiagram
{partial class FormShowNode{/// <summary>/// 必需的设计器变量。/// </summary>private System.ComponentModel.IContainer components = null;/// <summary>/// 清理所有正在使用的资源。/// </summary>/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#region Windows 窗体设计器生成的代码/// <summary>/// 设计器支持所需的方法 - 不要修改/// 使用代码编辑器修改此方法的内容。/// </summary>private void InitializeComponent(){this.tvGeography = new System.Windows.Forms.TreeView();this.graphControl1 = new NetronLight.GraphControl();this.btnShowDiagram = new System.Windows.Forms.Button();this.SuspendLayout();// // tvGeography// this.tvGeography.Location = new System.Drawing.Point(5, 44);this.tvGeography.Name = "tvGeography";this.tvGeography.Size = new System.Drawing.Size(280, 563);this.tvGeography.TabIndex = 0;// // graphControl1// this.graphControl1.Location = new System.Drawing.Point(297, 7);this.graphControl1.Name = "graphControl1";this.graphControl1.ShowGrid = true;this.graphControl1.Size = new System.Drawing.Size(1200, 600);this.graphControl1.TabIndex = 1;this.graphControl1.Text = "graphControl1";// // btnShowDiagram// this.btnShowDiagram.Font = new System.Drawing.Font("宋体", 12F);this.btnShowDiagram.Location = new System.Drawing.Point(40, 9);this.btnShowDiagram.Name = "btnShowDiagram";this.btnShowDiagram.Size = new System.Drawing.Size(158, 26);this.btnShowDiagram.TabIndex = 2;this.btnShowDiagram.Text = "展示树节点到图表";this.btnShowDiagram.UseVisualStyleBackColor = true;this.btnShowDiagram.Click += new System.EventHandler(this.btnShowDiagram_Click);// // FormShowNode// this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(1523, 611);this.Controls.Add(this.btnShowDiagram);this.Controls.Add(this.graphControl1);this.Controls.Add(this.tvGeography);this.Name = "FormShowNode";this.Text = "将树图节点展示到NetronLight图表中-斯内科";this.Load += new System.EventHandler(this.FormShowNode_Load);this.ResumeLayout(false);}#endregionprivate System.Windows.Forms.TreeView tvGeography;private NetronLight.GraphControl graphControl1;private System.Windows.Forms.Button btnShowDiagram;}
}

测试程序如下:

FormShowNode.cs文件

using NetronLight;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace ShowTreeNodeToDiagram
{public partial class FormShowNode : Form{public FormShowNode(){InitializeComponent();}private void GenerateGeographyMap() {TreeNode rootNode = new TreeNode("中国");TreeNode node1 = new TreeNode("广东省");TreeNode node2 = new TreeNode("河南省");TreeNode node3 = new TreeNode("江苏省");TreeNode node4 = new TreeNode("广州市");TreeNode node5 = new TreeNode("深圳市");TreeNode node6 = new TreeNode("惠州市");TreeNode node7 = new TreeNode("郑州市");TreeNode node8 = new TreeNode("许昌市");TreeNode node9 = new TreeNode("南阳市");TreeNode node10 = new TreeNode("南京市");TreeNode node11 = new TreeNode("常州市");TreeNode node12 = new TreeNode("越秀区");TreeNode node13 = new TreeNode("荔湾区");TreeNode node14 = new TreeNode("福田区");TreeNode node15 = new TreeNode("南山区");TreeNode node16 = new TreeNode("宝安区");TreeNode node17 = new TreeNode("博罗县");TreeNode node18 = new TreeNode("中原区");TreeNode node19 = new TreeNode("魏都区");TreeNode node20 = new TreeNode("卧龙区");TreeNode node21 = new TreeNode("江宁区");TreeNode node22 = new TreeNode("金坛区");TreeNode node23 = new TreeNode("洛阳市");node4.Nodes.AddRange(new TreeNode[] { node12, node13 });node5.Nodes.AddRange(new TreeNode[] { node14, node15, node16 });node6.Nodes.AddRange(new TreeNode[] { node17 });node7.Nodes.AddRange(new TreeNode[] { node18 });node8.Nodes.AddRange(new TreeNode[] { node19 });node9.Nodes.AddRange(new TreeNode[] { node20 });node10.Nodes.AddRange(new TreeNode[] { node21 });node11.Nodes.AddRange(new TreeNode[] { node22 });node1.Nodes.AddRange(new TreeNode[] { node4, node5, node6 });node2.Nodes.AddRange(new TreeNode[] { node7, node8, node9, node23 });node3.Nodes.AddRange(new TreeNode[] { node10, node11 });rootNode.Nodes.AddRange(new TreeNode[] { node1, node2, node3 });tvGeography.Nodes.Clear();tvGeography.Nodes.Add(rootNode);}private void FormShowNode_Load(object sender, EventArgs e){GenerateGeographyMap();tvGeography.ExpandAll();}/// <summary>/// 查找指定深度的所有节点集合/// 获取指定深度的节点集合,这些节点的属于同一行号【Y坐标一致】/// </summary>/// <param name="rootNode"></param>/// <param name="level"></param>/// <returns></returns>private List<TreeNode> GetCurrentLevelNodes(TreeNode rootNode, int level){List<TreeNode> nodeList = new List<TreeNode>();if (rootNode.Level == level){nodeList.Add(rootNode);}for (int i = 0; i < rootNode.Nodes.Count; i++){TreeNode current = rootNode.Nodes[i];//如果当前节点的深度 不等于 已知深度,就继续递归。当前节点的深度 等于 已知深度,就添加该节点if (current.Level == level){nodeList.Add(current);}else{List<TreeNode> tempList = GetCurrentLevelNodes(current, level);if (tempList.Count > 0){nodeList.AddRange(tempList);}}}return nodeList;}/// <summary>/// 获取树节点的最大深度Level/// </summary>/// <param name="rootNode"></param>/// <returns></returns>private int GetMaxLevel(TreeNode rootNode){int level = rootNode.Level;//默认当前节点的深度for (int i = 0; i < rootNode.Nodes.Count; i++){TreeNode current = rootNode.Nodes[i];//如果当前节点的深度 比 上一次的深度大,就继续递归if (current.Level > level){return GetMaxLevel(current);}}return level;}/// <summary>/// 通过树节点来获取对应的形状节点/// </summary>/// <param name="treeNode"></param>/// <returns></returns>private ShapeBase GetShapeByTreeNode(TreeNode treeNode){SimpleRectangle shapeNode = graphControl1.Shapes.Cast<SimpleRectangle>().ToList().Find(x => x.Text == treeNode.Text);return shapeNode;}/// <summary>/// 父子节点进行连线:连线端点Bottom, Left, Right, Top。由起始节点的底部端点 连接到 终止节点的顶部端点/// </summary>/// <param name="fromNode"></param>/// <param name="toNode"></param>private void AddLink(TreeNode fromNode, TreeNode toNode) {ShapeBase fromShape = GetShapeByTreeNode(fromNode);ShapeBase toShape = GetShapeByTreeNode(toNode);if (fromShape != null && toShape != null){//连线端点Bottom, Left, Right, Top。由起始节点的底部端点 连接到 终止节点的顶部端点graphControl1.AddConnection(fromShape.Connectors[0], toShape.Connectors[3]);}}/// <summary>/// 生成一个形状节点/// </summary>/// <param name="treeNode"></param>/// <param name="point"></param>private void GenerateShapeNode(TreeNode treeNode, Point point) {SimpleRectangle diagramNode = new SimpleRectangle(graphControl1);diagramNode.Text = treeNode.Text;//主程序提示 特殊处理diagramNode.Width = 80;diagramNode.Height = 30;diagramNode.Location = point;diagramNode.ShapeColor = Color.GreenYellow;graphControl1.Shapes.Add(diagramNode);}/// <summary>/// 生成节点之间的连线/// </summary>private void GenerateLinks(TreeNode treeNode){Stack<TreeNode> nodes = new Stack<TreeNode>();nodes.Push(treeNode);while (nodes.Count > 0){TreeNode fromNode = nodes.Pop();for (int i = 0; i < fromNode.Nodes.Count; i++){TreeNode toNode = fromNode.Nodes[i];AddLink(fromNode, toNode);nodes.Push(toNode);//将当前子节点插入集合中,继续连线}}}private void btnShowDiagram_Click(object sender, EventArgs e){graphControl1.Connections.Clear();//清除所有连线graphControl1.Shapes.Clear();////清除所有形状节点//根节点是第一个TreeNode rootNode = tvGeography.Nodes[0];int maxLevel = GetMaxLevel(rootNode);//获取树节点的最大深度//按照节点的深度Level将树节点进行分组for (int level = 0; level <= maxLevel; level++){List<TreeNode> nodeList = GetCurrentLevelNodes(rootNode, level);int offsetX = (graphControl1.Width - 80) / (nodeList.Count + 1);for (int i = 0; i < nodeList.Count; i++){GenerateShapeNode(nodeList[i], new Point(3 + offsetX * (i + 1), 20 + 140 * level));}}//生成节点之间的连线GenerateLinks(rootNode);//获取指定深度的节点集合。这些节点的属于同一行号【Y坐标一致】graphControl1.Invalidate();}}
}

运行如图:

点击展示按钮

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88817.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88817.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88817.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精密模具大深径比微孔尺寸检测方案 —— 激光频率梳 3D 轮廓检测

引言精密模具中大深径比微孔&#xff08;深径比&#xff1e;20:1&#xff0c;孔径&#xff1c;1mm&#xff09;的尺寸精度直接影响注塑件、电子元件等产品的成型质量。此类微孔具有孔径小、深度大、表面质量要求高&#xff08;Ra≤0.1μm&#xff09;等特点&#xff0c;传统检测…

defer学习指南

一、源头&#xff1a;早期管理资源&#xff08;如数据库连接、锁、文件句柄、网络连接&#xff09;和状态清理异常麻烦。 必须在每个可能的返回点&#xff08;return、err、panic&#xff09;手动重复清理代码&#xff0c;极易遗漏且打断主要逻辑思路&#xff01;像Java语言虽然…

NLP_知识图谱_大模型——个人学习记录

1. 自然语言处理、知识图谱、对话系统三大技术研究与应用 https://github.com/lihanghang/NLP-Knowledge-Graph 深度学习-自然语言处理(NLP)-知识图谱&#xff1a;知识图谱构建流程【本体构建、知识抽取&#xff08;实体抽取、 关系抽取、属性抽取&#xff09;、知识表示、知…

linux:进程详解(1)

目录 ​编辑 1.进程基本概念与基本操作 1.1 概念 1.2 描述进程-PCB 1.2.1PCB的基本概念 1.2.2 task_ struct 1.2.3 查看进程 2.进程状态 2.1 Linux内核源码展示 2.2 进程状态查看 ​编辑 2.3 Z(zombie)-僵⼫进程 2.4 僵尸进程的危害 2.5 孤儿进程 3.进程优先级 …

碳中和目标下的全球产业链重构:深度解析与未来路径

引言&#xff1a;气候临界点与产业链的系统性风险2023年&#xff0c;全球平均气温较工业化前上升1.2℃&#xff0c;南极冰盖年消融量达1500亿吨&#xff0c;极端天气事件导致的经济损失占全球GDP的2.3%。这一系列数据背后&#xff0c;暴露出传统产业链的致命缺陷——其设计逻辑…

FPGA实现SDI转LVDS视频发送,基于GTX+OSERDES2原语架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目本博已有的 SDI 编解码方案FPGA实现LVDS视频收发方案 3、工程详细设计方案工程设计原理框图SDI 输入设备Gv8601a 均衡器GTX 解串SMPTE SD/HD/3G SDI IP核BT1120转RGB奇…

新手向:使用Python构建高效的日志处理系统

本文将详细讲解如何使用Python开发一个专业的日志分析工具&#xff0c;能够自动化处理、分析和可视化各类日志文件&#xff0c;大幅提升运维效率。环境准备开发本工具需要以下环境配置&#xff1a;Python环境&#xff1a;建议Python 3.8或更高版本必要库&#xff1a;pandas&…

大模型-量化技术

简介 模型量化是一种重要的模型压缩技术。其核心目标是在可控精度损失下&#xff0c;将大模型中浮点型权重&#xff08;通常为 float32 等高精度格式&#xff09;近似转换为低精度离散值表示&#xff08;通常为 int8&#xff09;。 具体而言&#xff0c;该技术通过将模型的权重…

【C语言网络编程】HTTP 客户端请求(域名解析过程)

在做 C 语言网络编程或模拟 HTTP 客户端时&#xff0c;第一步就离不开“把域名解析为 IP 地址”这一步。很多人可能直接复制粘贴一段 gethostbyname 的代码&#xff0c;但未必真正理解它的原理。 本篇博客将围绕一个经典函数&#xff1a; char *host_to_ip(const char *hostna…

Node.js特训专栏-实战进阶:16. RBAC权限模型设计

🔥 欢迎来到 Node.js 实战专栏!在这里,每一行代码都是解锁高性能应用的钥匙,让我们一起开启 Node.js 的奇妙开发之旅! Node.js 特训专栏主页 专栏内容规划详情 我将从RBAC权限模型的基础概念、核心组件讲起,详细阐述其设计原则、数据库模型设计,还会结合代码示例展示在…

mac上BRPC的CMakeLists.txt优化:解决Protobuf路径问题

问题背景与挑战 在构建高性能RPC框架BRPC时&#xff0c;​Protobuf依赖路径的配置往往是开发者面临的主要挑战之一。原始CMake配置在寻找Protobuf库时存在以下痛点&#xff1a; ​路径搜索不精确​&#xff1a;默认find_library无法定位自定义安装路径下的Protobuf​版本兼容…

Go 性能分析利器:pprof 工具实战指南

在 Go 语言开发中&#xff0c;性能问题往往是项目上线后最棘手的挑战之一。无论是 CPU 占用过高、内存泄漏&#xff0c;还是 goroutine 失控&#xff0c;都可能导致服务响应缓慢甚至崩溃。而pprof作为 Go 官方提供的性能分析工具&#xff0c;就像一把精准的手术刀&#xff0c;能…

fio测试SSD直接I/O(Direct IO)性能仅有100MB/s的问题解决

针对您使用fio测试SSD直接I/O&#xff08;Direct IO&#xff09;性能仅有100MB/s的问题&#xff0c;结合SSD特性和fio测试原理 fio测试SSD直接I/O&#xff08;Direct IO&#xff09;性能仅有100MB/s的问题 - LinuxGuideLinuxGuide 以下是可能的原因及优化方案&#xff1a; &a…

EVO-0:具有隐空间理解的视觉-语言-动作模型

25年6月来自上海交大、EvoMind Tech 和上海算法创新研究院&#xff08;IAAR-Shanghai&#xff09;的论文“EVO-0: Vision-Language-Action Model with Implicit Spatial Understanding”。 视觉-语言-动作 (VLA) 模型已成为一种有前途的框架&#xff0c;可使通用机器人能够在现…

文心大模型4.5开源测评:轻量化部署实践与多维度能力验证

前言&#xff1a;开源浪潮下的轻量化革命 2025年百度文心大模型4.5系列的开源&#xff0c;标志着国产大模型从“参数竞赛”转向“实用落地”的关键转折。当行业仍在追逐千亿参数模型时&#xff0c;文心4.5以0.3B轻量级模型撕开一条新赛道——单卡部署、低成本运维、中文场景高…

LeetCode 2401.最长优雅子数组

给你一个由 正 整数组成的数组 nums 。 如果 nums 的子数组中位于 不同 位置的每对元素按位 与&#xff08;AND&#xff09;运算的结果等于 0 &#xff0c;则称该子数组为 优雅 子数组。 返回 最长 的优雅子数组的长度。 子数组 是数组中的一个 连续 部分。 注意&#xff1a;长…

中华心法问答系统的解读(1)

中华心法问答系统一、研究背景1. 研究意义2. 研究目的3. 信息检索技术二、主要研究内容三、相关技术介绍1. Flask框架技术2. BERT模型&#xff08;1&#xff09;基本概念&#xff08;2&#xff09;BERT解决的问题&#xff08;3&#xff09;BERT的核心结构a. 模型结构b. 预训练任…

Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频摘要快速生成与检索优化(345)

Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频摘要快速生成与检索优化&#xff08;345&#xff09;引言&#xff1a;正文&#xff1a;一、Java 构建的全场景视频处理系统&#xff08;含校园 / 工厂 / 矿区适配&#xff09;1.1 校园宿舍区夜间检索方案&#xff08;…

信号量机制,互斥的避免自旋锁的实现方法(操作系统)

这次的比喻场景要升级了&#xff0c;因为它既能解决互斥问题&#xff0c;也能解决同步问题。我们用一个更综合的场景&#xff1a;一个拥有多辆共享单车的站点。共享单车 (资源)&#xff1a;站点里有多辆共享单车&#xff0c;数量是有限的。你 (进程)&#xff1a;想借一辆车去办…

零基础 “入坑” Java--- 十、继承

文章目录一、何为继承二、继承语法三、父类成员访问1.成员变量2.成员方法四、super关键字五、子类构造方法六、super和this辨析七、再谈初始化八、protected关键字九、继承方式十、final关键字十一、继承与组合根据我们学过的类的知识&#xff0c;我们来定义两个类&#xff1a;…