中文电子审批流程管理中的组织机构图,往往不会让我们满意,因为它和传统意义上的组织机构图不是很一样。如下图:

Microsoft.GroupBoard.EnhancedGroup的TreeView组织机构图。

风铃的JS组织机构图(WebPart):

WebPart代码:


using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Serialization;

using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;
using Microsoft.GroupBoard.EnhancedGroup;

namespace Simone.SharePoint.WebParts
{
    [Guid(
"1111f20d-84f7-4a02-9010-bcb62591d96d")]
    
public class JSOrgChart : System.Web.UI.WebControls.WebParts.WebPart
    {

        
#region Private Members       

        
private SPWeb m_web;   

        
private SPWeb TargetWeb
        {
            
get
            {
                
if (m_web == null)
                {
                    m_web 
= SPControl.GetContextWeb(Context);
                }
                
return m_web;
            }
        }        

        
#endregion

        
public JSOrgChart()
        {
        }

        
protected override void CreateChildControls()
        {
            
base.CreateChildControls();
        }

        
protected override void Render(HtmlTextWriter writer)
        {
            
try
            {
                StringBuilder sb 
= new System.Text.StringBuilder();
                sb.Append(
@"
                <script type='text/javascript' src='_layouts/JSOrgChart/ECOTree.js'></script>
                <script type='text/javascript' src='_layouts/JSOrgChart/wz_tooltip.js'></script>         
                <link type='text/css' rel='stylesheet' href='_layouts/JSOrgChart/ECOTree.css' />
                <style type='text/css'>v\:*{ behavior:url(#default#VML);}</style> 
                <style type='text/css'>
                .copy {
                    font-family : ""Verdana"";                
                    font-size : 12px;
                    color : #CCCCCC;
                }    
                </style>

                <div id='myTreeContainer'></div>

                    <script language='javascript'>
                    var myTree = null;
                    function CreateTree() {
                        myTree = new ECOTree('myTree','myTreeContainer');
    
                        myTree.config.colorStyle = ECOTree.CS_LEVEL;
                        myTree.config.nodeFill = ECOTree.NF_FLAT;
                        myTree.config.useTarget = false;
                        myTree.config.selectMode = ECOTree.SL_NONE;
                        myTree.config.defaultNodeWidth = 120;
                        myTree.config.defaultNodeHeight = 40;
                        myTree.config.iSubtreeSeparation = 15;
                        myTree.config.iSiblingSeparation =5;
                        myTree.config.iLevelSeparation = 30;
                        myTree.config.expandedImage = '_layouts/JSOrgChart/img/less.gif';
                        myTree.config.collapsedImage = '_layouts/JSOrgChart/img/plus.gif';
                        myTree.config.transImage = '_layouts/JSOrgChart/img/trans.gif';
");

                sb.Append(AddList());

                sb.AppendLine(
"myTree.UpdateTree(); }; CreateTree(); ");

                sb.Append(
"</script>");
                writer.Write(sb.ToString());
            }
            
catch (Exception ex)
            {
                writer.Write(ex.Message 
+ ";" + ex.StackTrace);
            }
        }

        
private StringBuilder AddList()
        {
            StringBuilder sb 
= new StringBuilder();
            Organization root 
= new Organization(TargetWeb, "组织");
            sb.Append(String.Format(
"myTree.add({0},-1,'{1}');", root.ID, root.Name));
            sb.Append(AddSubOrgs(root));
            
return sb;
        }

        
private StringBuilder AddSubOrgs(Organization top)
        {
            StringBuilder sb 
= new StringBuilder();
            
foreach (Organization organization in top.SubOrganizations)
            {
                sb.Append(String.Format(
"myTree.add({0},{1},'{2}');", organization.ID, organization.ParentOrganization.ID, organization.Name));
                sb.Append(AddSubOrgs(organization));
            }
            
return sb;
        }
    }
}

PS:

1、


Organization root = new Organization(TargetWeb, "组织");

这里的"组织"是你的根组织名称。当然你会问如果根组织的名称改变了怎么办?这个问题风铃会在后续补充。

2、

关于Graphic JavaScript Tree。如果你不只想显示组织名称,还想显示组织机构其他的信息。

请将


sb.Append(String.Format("myTree.add({0},{1},'{2}');", organization.ID, organization.ParentOrganization.ID, organization.Name));

更改为


sb.Append(String.Format("myTree.add({0},{1},'", organization.ID, organization.ParentOrganization.ID));
sb.Append(String.Format(
@"<span class=""econode"" style=""padding: 0px;""><a class=""ecolink"" href=""/_layouts/egedtorg.aspx?id={0}&showdeptcode=True"" target=""_new"">{1}</a></span><br />", organization.ID, organization.Name));
sb.Append(
@"<table witdth=""180px""><tr><td width=""100%"" class=""econode"" style=""text-align: center;"">");
sb.Append(String.Format(
@"{0}<br />{1}<br />", organization.Code, organization.Description));
sb.AppendLine(
"</td></tr></table>');");

我想这样就差不多了。自己在Table里面添加吧。

3、

与Microsoft.GroupBoard.EnhancedGroup有什么关系?

我用了Microsoft.GroupBoard.EnhancedGroup里面的Organization类,并利用Organization.SubOrganizations属性作了一个递归函数。(同事和我说用递归函数不好,会影响效率,可是我早就忘记了把递归函数改成非递归函数的算法了)。

4、

"_layouts/JSOrgChart/"这个文件夹在哪里?

如果您有这个疑问的话,那我很明确的告诉您C:\Program Files\Common Files\microsoft shared\Web Server Extensions\12\TEMPLATE\LAYOUTS

当然风铃建议在做SharePoint开发时,LAYOUTS文件夹最好放在C:\inetpub\wwwroot\wss\VirtualDirectories\[端口]下,当然你需要在IIS中更改[端口]网站的虚拟目录_LAYOUTS的物理路径。

JSOrgChart内文件打包下载:http://files.cnblogs.com/windbell/JSOrgChart.rar

本日志由 胡子 于 2008-08-25 20:42:06 发表,目前已经被浏览 2541 次,评论 0 次;

作者添加了以下标签: Organization ChartGraphic JavaScript Tree组织机构图

引用通告:http://21pt.com/Article/78/Trackback.ashx

评论订阅:http://21pt.com/Article/78/Feeds.ashx

评论列表

  1. 2009-06-29 10:22:31 | # | 回复
    这有直接的例子下载么?这样看不好明白
(必填)
(必填,不会被公开)
你的评论在博主审核后方可公开。