您的位置:首页 > 其它

显示树状结构,组织结构图

2009-10-22 14:44 239 查看
导言

目前,在组织中,我们经常需要显示树状结构。这可以为文件系统,组织结构图,物料清单等,本文进行讨论组件,可以生成所需的树,根据在一个DataTable中的数据图像。该DLL可以调用Windows窗体或ASP.NET。的参数(尺寸,颜色)大部分可以控制使用该DLL的开发,它们是作为属性暴露出来。

这此DLL的第一个版本被称为OrgChart发生器,并出版发行。在显示器的BOM的应用开发,已变得越来越明显的组织结构图生成器没有几个非常重要的问题:

这太具体:DLL是一树发电机,应该这么叫。
树中的一个节点不能出现两次。雇员可工作超过一个部门。
使用的数据结构(包括一个XmlDocument和SortedDictionary)还不够好。
因此,它成为必要重写整个应用程序,并给它一个新名称。因此,这篇文章。

使用代码
下载的ZIP文件包含C#解决方案,它有两个项目:

TreeGenerator,其中包含了生成的DLL树图像编码
TestTreeGenerator,其中包含一个Windows窗体应用程序演示TreeGenerator及其使用的能力。
构造
该TreeGenerator接受一个在构造类型DataTable,与节点列表,以便产生树。该TreeData.TreeDataTableDataTable是DataTable中的类将接受在构造。它可以包含整个树状结构或只是部分。如果它包含整个树,多miniTrees可以创建从对象的同一实例。 DataTable的结构如下:

字符串nodeID -主键-节点的编号-员工人数,项目代码或其他任何节点的唯一标识
字符串parentNodeID -主键-该节点的父节点的ID。这个定义的树状结构。这可能是String.Empty
字符串nodeDescription -一个节点的简短说明
字符串nodeNote -一个节点的说明
方法
这只有一个主要方法,GenerateTree,这是超载。重载之间的区别是,一个方法接受作为参数所产生的图像所需的大小和调整大小,然后返回它。其他回报,在按计算确定的大小-的设备的数目(包括X和Y)倍的节点数量。
此方法返回的System.IO.Stream,可用于显示图像,保存到文件,或任何其他活动。这种方法的另一个重要参数是StartFromNodeID。此参数确定哪个节点将在树的顶端。

另一种方法存在,主要是作为辅助方法。 getRectangleFromNode是在内部使用,但也可以用于外部返回节点的矩形坐标,根据上的XMLNode。这个类/ DLL可以使用Windows窗体从以下列方式申请:

倒塌复制代码
/ /首先-创建数据表。在现实生活中,将必须从数据库中提取
/ /或其他方式造成了一些。
到Form1_Load私人无效(对象发送,EventArgs五)(
TreeGenerator.TreeData.TreeDataTableDataTable dtTree =
新TreeData.TreeDataTableDataTable();
dtTree.AddTreeDataTableRow(“1000”,“”,“1000 ","");
dtTree.AddTreeDataTableRow(“2000”,“1000”,“2000 ","");
dtTree.AddTreeDataTableRow(“2001”,“1000”,“2001 ","");
dtTree.AddTreeDataTableRow(“3000”,“2000”,“3000 ","");
dtTree.AddTreeDataTableRow(“3001”,“2000”,“3001 ","");
dtTree.AddTreeDataTableRow(“3000”,“2001”,“3000 ","");
dtTree.AddTreeDataTableRow(“4000”,“3000”,“4000 ","");
dtTree.AddTreeDataTableRow(“4001”,“3000”,“4001”,“”);
/ /实例化对象
myTree的=新TreeBuilder(dtTree);

/ /现在-生成树本身
picTree.Image = Image.FromStream(
myTree.GenerateTree(“1000”,
System.Drawing.Imaging.ImageFormat.Bmp));性质
返回的形象默认属性。为了控制的大小和树的颜色,这些属性是可以改变的(各种规模的像素):

BoxFillColor -将填补哪种颜色的方块
BoxWidth -在每个盒子宽度
BoxHeight -在每个盒子高度
保证金-保证金从到盒子上图像的边缘
HorizontalSpace -空间在同一水平上的雇员之间的第2盒
VerticalSpace - 2间各层次的员工空间
文字大小-为节点的细节字体大小
LineColor -颜色双方框线和连接线
线宽-宽度双方框线和连接线
博客也会-颜色在图像的背景
文字颜色-字体颜色
xmlTree -一个XmlDocument包含所有的树中的数据,包括图表上的每个节点的位置。这可以检查是否有特定的节点使用点击。
更改这些属性可能会产生奇怪的结果,所以应谨慎由用户决定。例如,它也不会好看如果同时BoxFillColor和文字颜色都是一样的。

捕获鼠标点击事件
使用xmlTree属性,可以确定,用户点击。下面是一个Windows窗体应用程序的例子。这将不会用于ASP.NET。

倒塌复制代码
私人无效picOrgChart_MouseClick(对象发送,短信我五)

矩形currentRect;
/ /判断鼠标点击一个框,
/ /若有,显示节点的描述。
字符串的SelectedNode =“没有节点”;
/ /查找节点
Foreach源(在myTree.xmlTree.SelectNodes的XMLNode oNode(“/ /节点”))

/ /遍历所有的员工,直到找到。
currentRect = myTree.getRectangleFromNode(oNode);
如果(e.X“= currentRect.Left&&
e.X“= currentRect.Right&&
e.Y“= currentRect.Top&&
e.Y“= currentRect.Bottom)

的SelectedNode =
oNode.Attributes [“nodeDescription”]。的InnerText;
中断;



MessageBox.Show(的SelectedNode);
)ASP.NET使用
在ASP.NET中使用此代码需要两个网页(见附表ZIP文件):

ShowTree.aspx -接受用户的输入和显示图像
OrgChartImage.aspx -生成的图像,并返回给调用页面。
ShowTree.aspx
该页面包含一个文本框,接受任何输入。不管是什么类型将成为树的顶部节点用户。在现实生活中,文本框(或DDL,或任何其他控制)将只接受雇员身份证,编号等,在“显示树点击”按钮,将显示输入的树名。在这种情况下,这将是一个随机生成的树。在现实生活中,树应选择数据从一个数据库。

关于树节点的点击会显示该节点的孩子在一个新的树节点。这是可能的,而不是显示一个新的树每次扩大树,树保持静态对象dataTable的所有的时间。

本页面的主要功能是产生一个图像。该图像可以显示为一个图像映射,或任何其他的形象标记。在这种情况下,imageMap.ImageUrl链接到的网页内容从缓存中的图像,并返回一个流中。
此功能也得到了TreeGenerator对象XmlDocument和定义了图像映射的热点。

倒塌复制代码
私人无效GenerateChart(字符串mItem)

/ /创建图表对象
TreeGenerator.TreeBuilder currentBOM
=新TreeGenerator.TreeBuilder(GetDT(mItem));
/ /指定视觉特性
currentBOM.HorizontalSpace = 15;
currentBOM.VerticalSpace = 15;
currentBOM.FontSize = 7;
currentBOM.BoxHeight = 80;
currentBOM.BoxWidth = 80;
currentBOM.LineColor =
System.Drawing.ColorTranslator.FromHtml(“#BFBFC9”);
currentBOM.FontColor =
System.Drawing.ColorTranslator.FromHtml(“#3B4164”);
System.Drawing.Image团=
System.Drawing.Image.FromStream(
currentBOM.GenerateTree(
mItem,System.Drawing.Imaging.ImageFormat.Bmp));
字符串nameOfImage =
Session.SessionID +“CurrentImage”;
/ /保存在缓存中,由创建图像页面中使用
Cache.Insert(nameOfImage,业主立案法团,空,
DateTime.MaxValue,TimeSpan.FromMinutes(1),
CacheItemPriority.NotRemovable,空);
/ /更新项目的图片地图
/ /查询字符串供应图像名称
impBOM.ImageUrl =“〜/ OrgChartImage.aspx?编号=”+ nameOfImage;
/ /删除所有热点
impBOM.HotSpots.Clear();
/ /重新生成的热点。
Foreach源(在currentBOM.xmlTree.SelectNodes的XMLNode oNode(“/ /节点”))

RectangleHotSpot RectHS
=新RectangleHotSpot();
RectHS.HotSpotMode = HotSpotMode.PostBack;矩形
currentRect = currentBOM.getRectangleFromNode(oNode);
RectHS.Top = currentRect.Top;
RectHS.Bottom = currentRect.Bottom;
RectHS.Left = currentRect.Left;
RectHS.Right = currentRect.Right;
RectHS.PostBackValue = oNode.Attributes [“nodeID”]。的InnerText;
RectHS.AlternateText
= oNode.Attributes [“nodeDescription”]。的InnerText;
impBOM.HotSpots.Add(RectHS);

)OrgChartImage.aspx
本页面加载缓存项的基础上传递的参数,将其转换成一个形象,并写入到输出流中。只有一个函数在这里:

倒塌复制代码
保护无效Page_Load(对象发送,EventArgs五)

/ /更改的响应头输出一个JPEG图像。
this.Response.Clear();
this.Response.ContentType =“图片/ jpeg格式”;
System.Drawing.Image团=空;
/ /生成图像
字符串imageName = Request.QueryString [“身份证”];
如果(高速缓存[imageName] =空)

业主立案法团=(System.Drawing.Image)高速缓存[imageName];
/ /写的图像以JPEG格式响应流。
OC.Save(this.Response.OutputStream,ImageFormat.Jpeg);
OC.Dispose();

)历史
2007年9月16日-首次发布
2007年9月23日-新增ASP.NET使用的范本

许可
这篇文章,与任何相关的源代码和文件一起,是根据该法授权项目开放许可(CPOL)

关于作者
罗特姆萨皮尔

会员
职业:Web开发
地点:以色列
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: