当前位置: 首页 > news >正文

【WinForm UI控件系列】OrgChart 组织结构图(winform UI控件)拓扑图

OrgChart 是一个功能丰富的组织结构图控件,支持多种布局方向、节点样式自定义、展开收起功能,以及灵活的连接线样式配置。

一、效果图




二、使用说明

OrgChart 组织结构图控件

控件名称

OrgChart

中文名称

组织结构图控件

控件优点

OrgChart 是一个功能丰富的组织结构图控件,支持多种布局方向、节点样式自定义、展开收起功能,以及灵活的连接线样式配置。

主要特性

  • 多种布局方向:支持左到右、右到左、上到下、下到上四种布局
  • 展开收起:节点支持展开和收起子节点,点击按钮切换
  • 自定义节点样式:支持填充色、边框色、字体、圆角等
  • 丰富的连接线样式:支持多种线宽、线型、箭头类型
  • 事件支持:节点点击、展开收起事件
  • 数据绑定:支持树形节点结构

重要参数说明

布局属性

属性名类型默认值说明
LayoutOrgChartLayoutLeftToRight布局方向
HorizontalSpacingint40水平间距
VerticalSpacingint20垂直间距

布局方向(OrgChartLayout)

说明
LeftToRight从左到右布局(根节点在左)
RightToLeft从右到左布局(根节点在右)
TopToBottom从上到下布局(根节点在上)
BottomToTop从下到上布局(根节点在下)

节点属性

属性名类型默认值说明
UseNodeColorsbooltrue是否使用节点自定义颜色
DefaultFillColorColor(24,144,255)默认填充颜色
DefaultBorderColorColor(24,144,255)默认边框颜色
DefaultForeColorColorWhite默认字体颜色
DefaultFontFont微软雅黑, 10默认字体
NodePaddingint8默认内边距
NodeBorderWidthint1默认边框宽度
NodeCornerRadiusint4默认圆角半径
ShowExpandButtonsbooltrue是否显示展开按钮

连接线样式(ConnectionStyle)

属性名类型默认值说明
LineColorColorBlack线条颜色
LineTypeLineTypeSolid线条类型(实线、虚线等)
LineStyleConnectionLineStyleOrthogonal连接线样式(直角、曲线等)
LineWidthLineWidthW1线宽
ArrowTypeArrowTypeNone箭头类型
ArrowColorColorEmpty箭头颜色(默认与线条相同)

连接线样式(ConnectionLineStyle)

说明
Orthogonal直角折线(默认)
Curved贝塞尔曲线
Straight直线连接
Tree树形连接(分支线)
Fishbone鱼骨图样式
Rounded圆角折线

线条类型(LineType)

说明
Solid实线
Dashed虚线
Dotted点线
DashDot点划线
DashDotDot双点划线

线宽选项(LineWidth)

实际宽度(px)
W0_250.25
W0_50.5
W0_750.75
W11.0
W1_51.5
W2_252.25
W33.0
W44.0
W55.0
W66.0

箭头类型(ArrowType)

说明
None无箭头
Standard标准箭头
TriangleSolid实心三角形
TriangleHollow空心三角形
Circle圆形
Diamond菱形
Square方块
Dot圆点

节点数据结构(OrgChartNode)

属性名类型说明
Textstring节点文本
FillColorColor填充颜色
BorderColorColor边框颜色
ForeColorColor字体颜色
FontFont字体
Expandedbool是否展开
Paddingint内边距
BorderWidthint边框宽度
CornerRadiusint圆角半径
ShowExpandButtonbool是否显示展开按钮
ChildrenList<OrgChartNode>子节点集合
Tagobject自定义标签

重要事件

事件名说明参数
NodeClick节点被点击时触发OrgChartNodeEventArgs
NodeToggle节点展开/收起时触发OrgChartNodeEventArgs
PropertyChanged属性值改变时触发PropertyChangedEventArgs

使用示例

基本使用

// 创建组织结构图OrgChartorgChart=newOrgChart();orgChart.Dock=DockStyle.Fill;orgChart.Layout=OrgChartLayout.LeftToRight;// 创建节点OrgChartNoderoot=newOrgChartNode();root.Text="CEO";root.FillColor=Color.FromArgb(24,144,255);// 添加子节点OrgChartNodechild1=newOrgChartNode();child1.Text="技术部";child1.FillColor=Color.FromArgb(64,169,131);root.Children.Add(child1);OrgChartNodechild2=newOrgChartNode();child2.Text="市场部";child2.FillColor=Color.FromArgb(255,193,7);root.Children.Add(child2);// 设置根节点orgChart.RootNode=root;this.Controls.Add(orgChart);

多层结构

// 创建三层结构OrgChartNoderoot=newOrgChartNode{Text="公司总部"};OrgChartNodedept1=newOrgChartNode{Text="研发中心"};OrgChartNodeteam1=newOrgChartNode{Text="前端团队"};OrgChartNodeteam2=newOrgChartNode{Text="后端团队"};dept1.Children.Add(team1);dept1.Children.Add(team2);root.Children.Add(dept1);OrgChartNodedept2=newOrgChartNode{Text="运营中心"};OrgChartNodeteam3=newOrgChartNode{Text="产品运营"};OrgChartNodeteam4=newOrgChartNode{Text="用户运营"};dept2.Children.Add(team3);dept2.Children.Add(team4);root.Children.Add(dept2);orgChart.RootNode=root;

自定义连接线样式

// 设置连接线样式orgChart.ConnectionStyle.LineColor=Color.Gray;orgChart.ConnectionStyle.LineType=LineType.Dashed;orgChart.ConnectionStyle.LineWidth=LineWidth.W1_5;orgChart.ConnectionStyle.ArrowType=ArrowType.TriangleSolid;orgChart.ConnectionStyle.ArrowColor=Color.Red;

连接线样式

// 直角折线(默认)orgChart.ConnectionStyle.LineStyle=ConnectionLineStyle.Orthogonal;// 贝塞尔曲线orgChart.ConnectionStyle.LineStyle=ConnectionLineStyle.Curved;// 直线连接orgChart.ConnectionStyle.LineStyle=ConnectionLineStyle.Straight;// 树形连接(分支线)orgChart.ConnectionStyle.LineStyle=ConnectionLineStyle.Tree;// 圆角折线orgChart.ConnectionStyle.LineStyle=ConnectionLineStyle.Rounded;

上下布局

// 从上到下布局orgChart.Layout=OrgChartLayout.TopToBottom;orgChart.HorizontalSpacing=30;orgChart.VerticalSpacing=30;

事件处理

// 节点点击事件orgChart.NodeClick+=(sender,e)=>{MessageBox.Show($"点击了节点:{e.Node.Text}");};// 节点展开/收起事件orgChart.NodeToggle+=(sender,e)=>{Console.WriteLine($"节点{e.Node.Text}{(e.Node.Expanded?"展开":"收起")}");};

动态修改节点

// 动态添加子节点OrgChartNodenewNode=newOrgChartNode();newNode.Text="新部门";newNode.FillColor=Color.Purple;root.Children.Add(newNode);// 切换节点状态node.ToggleExpand();// 修改节点样式node.Text="新名称";node.FillColor=Color.Blue;

批量设置样式

// 设置所有节点使用默认样式orgChart.UseNodeColors=false;orgChart.DefaultFillColor=Color.Gray;orgChart.DefaultForeColor=Color.White;orgChart.DefaultFont=newFont("宋体",12,FontStyle.Bold);

注意事项

  1. 布局计算:控件会自动计算布局,但节点过多时建议限制层级
  2. 性能优化:大量节点时考虑虚拟滚动或分页
  3. 颜色设置UseNodeColors为 false 时使用控件级默认颜色
  4. 展开按钮:只有有子节点的节点才显示展开按钮
  5. 尺寸自适应:建议将控件 Dock 设为 Fill 或设置合适的 Size
  6. 布局变化:展开/折叠子节点时,父节点到子节点的连接线位置会根据子树整体尺寸自动调整,这是标准树形布局的特性

已知限制

  1. 展开/折叠时布局变化:当展开或折叠子节点时,父节点到子节点的连接线位置可能会根据子树整体尺寸发生变化。这是由于标准树形布局算法会重新计算整个树的布局所致。如需保持连接线位置稳定,需要使用不同的布局策略(如固定子节点位置),当前版本未实现此功能。
  2. L2R/R2L 布局:LeftToRight 和 RightToLeft 布局方向在展开/折叠节点时,垂直方向的居中计算可能与预期略有差异。
  3. 文本垂直显示:当节点使用垂直文本显示时,节点高度会根据文本字符数量自动调整,如果节点内容过多可能导致节点过高。

使用建议

  • 小型组织:直接使用控件显示完整结构
  • 大型组织:配合展开收起功能,分层展示
  • 自定义样式:根据部门类型设置不同颜色
  • 交互增强:结合事件实现选中高亮、右键菜单等功能

三、后记

更多控件,敬请关注,如有需求、好的建议,请留言(xue5zhijing)

更多:https://blog.csdn.net/uaime/article/details/161663833

http://www.cnnetsun.cn/news/2863436.html

相关文章:

  • 使用ResNet网络实现猫狗数据集分类
  • 瓦楞纸板厂主要集中在哪些地区?
  • git遇见的问题[2]
  • 如何用 C++ 模拟一个点阵显示器
  • 一个基于 .NET 与 Avalonia 构建、面向 TrinityCore 的开源 WoW 数据库编辑器
  • Redis分布式锁进阶第九十六篇
  • 用数据分析破解彩票迷思:归因分析与理性决策框架
  • 从jQuery的这两个CVE漏洞,聊聊前端安全中容易被忽略的‘消毒’陷阱
  • 保姆级教程:在uni-app H5项目中集成WebRTC,实现双向音视频通话(含心跳保活与TURN服务器配置)
  • 告别卡顿:用tiffslide和OME-TIFF金字塔优化你的病理图像查看体验
  • 从一行RTL代码到最终芯片:手把手拆解Synopsys工具链在数字IC设计中的实战联动
  • 从LM741芯片内部看起:手把手拆解差动放大电路,搞懂运放输入级的秘密
  • 盲超分的‘内功心法’:拆解KernelGAN如何仅凭一张图,教会AI理解图像自身的模糊规律
  • 从‘adb devices‘离线到‘more than one device‘报错:一次搞定Android调试连接的常见疑难杂症
  • 别再手动装Python库了!用TLJH在Ubuntu 22.04上搭建一个团队共享的JupyterHub环境(附国内镜像源配置)
  • F28335 GPIO输入滤波(采样窗口)配置详解:告别按键抖动与噪声干扰
  • 大模型推理路径动态裁剪:语义确定性驱动的计算蒸发机制
  • 别再乱放文件了!RimWorld Mod汉化保姆级指南:DefInjected与Keyed文件夹到底怎么用?
  • 别再傻傻用真实邮箱了!手把手教你用Python脚本和Swaks工具安全测试邮件伪造(附避坑指南)
  • 目标检测MAP提升2%!在YOLOv5/YOLOv8中集成CBAM模块的保姆级教程
  • 从“Hello World”到“数字金字塔”:用C语言循环玩转图形打印的保姆级指南
  • TXS0108E电平转换芯片深度评测:开漏模式2Mbps够用吗?实测对比推挽60Mbps
  • 从X86到RISC-V:手把手带你理解C906这颗国产CPU的MMU设计差异
  • 告别卡顿!STM32 SPI DMA驱动ST7735刷图性能优化实战
  • ARM Cortex-M0+微控制器实战:从LPC82x看低成本嵌入式开发
  • 模板驱动文档自动化:工程化构建可复用、可审计的内容流水线
  • MuleSoft企业级AI编排:构建可审计、可降级、可治理的大模型集成架构
  • 别再手动开节点了!ROS Noetic下用launch文件一键启动机器人仿真的保姆级教程
  • 别再用Thread.sleep了!解决SocketException: Software caused connection abort的三种正确姿势
  • CISP-PTE文件上传题新思路:绕过随机命名,用PHP文件读写函数写Webshell