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

 导言


目前,在组织中,我们经常需要显示树状结构。这可以为文件系统,组织结构图,物料清单等,本文进行讨论组件,可以生成所需的树,根据在一个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开发
地点:以色列

你可能感兴趣的:(显示树状结构,组织结构图)