C#將樹圖節點展示到NetronLight圖表中

之前寫過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;…