Sharepoint中用treeview来显示组织机构的人员状态的webpart

Sharepoint中用treeview来显示组织机构的人员状态的webpart

2009-04-28 16:23 by Virus-BeautyCode, 1646 阅读, 0 评论, 收藏编辑


 /// <summary>
        /// 列表项在列表之间的拷贝
        /// </summary>
        /// <param name="sourceItem"></param>
        /// <param name="destinationListName"></param>
        /// <returns></returns>
        public static SPListItem CopyItem(SPListItem sourceItem, string destinationListName)
        {
            //copy sourceItem to destinationList
            SPList destinationList = sourceItem.Web.Lists[destinationListName];
            SPListItem targetItem = destinationList.Items.Add();
            foreach (SPField f in sourceItem.Fields)
            {
                if (!f.ReadOnlyField && f.InternalName != "Attachments")
                {
                    targetItem[f.InternalName] = sourceItem[f.InternalName];
                }
            }
            //copy attachments
            foreach (string fileName in sourceItem.Attachments)
            {
                SPFile file = sourceItem.ParentList.ParentWeb.GetFile(sourceItem.Attachments.UrlPrefix + fileName);
                byte[] imageData = file.OpenBinary();
                targetItem.Attachments.Add(fileName, imageData);
            }
            targetItem.Update();
            return targetItem;
        }


 /// <summary>
        /// 获取一个网站的文件系统结构的递归函数
        /// </summary>
        /// <param name="myFolder"></param>
        /// <param name="level"></param>
        public void GetFolderFiles(SPFolder myFolder, string level)
        {
            try
            {
                string tempItem = myFolder.Item.Name;
                if (myFolder.ContainingDocumentLibrary != Guid.Empty)
                {
                    Console.WriteLine(level + myFolder.Name + "(我是文档库文件夹)");
                }
                else
                {
                    Console.WriteLine(level + myFolder.Name + "(我是列表库文件夹)");
                }
            }
            catch
            {
                Console.WriteLine(level + myFolder.Name + "(我是网站普通文件夹)");
            }
            foreach (SPFile myFile in myFolder.Files)
            {
                Console.WriteLine(level + " " + myFile.Name);
            }
            foreach (SPFolder mySubFolder in myFolder.SubFolders)
            {
                GetFolderFiles(mySubFolder, level + " ");
            }
        }

使用.net操作AD域的一些代码共享

http://blog.lickies.cn/Lists/Posts/Post.aspx?List=34201ce7%2Dcc0e%2D452a%2D949a%2Dffcf74a1780a&ID=6

AD认证模式下如何通过表单登录来代替WINDOWS弹出窗口的方法

http://blog.lickies.cn/Lists/Posts/Post.aspx?List=34201ce7%2Dcc0e%2D452a%2D949a%2Dffcf74a1780a&ID=4&Source=http%3A%2F%2Fblog%2Elickies%2Ecn%2FLists%2FPosts%2FAllPosts%2Easpx

目前做的一个项目有一个需求,就是客户要求一级子部门有自己的网站,网站要求显示成员和子部门的成员,用树结构来显示。

同时客户还有一些横向的组织,就是例如卫生工作小组、防火工作小组之类的,抽取组织结构中的人员来组成,要求这些小组也有自己的网站,网站同样显示人员状态,这里就不用树形了,因为只有一级的关系。

定义两个内容类型:一个用来放组织结构或者工作组,继承文件夹SPFolder;一个代表人员,有一个栏目的类型为SPUser,代表这个人在网站中的信息

还发现了一个细节的地方,SP的细节地方真是多啊,一不小心就掉进陷阱了。

今天发现的就是SPFolder,SPWeb.GetFolder()和list.RootFolder.SubFolders[]取出来的SPFolder不是一样的,前者的SPFolder是孤立的,没有ParentFolder和SubFolders,这两个值都是"",后者获取的SPFolder是可以获取前后关系的。

效果如下图

图1  组织结构用户图

图2  工作小组用户图

代码如下


using System;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Serialization;
using System.ComponentModel;

using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;

namespace Kimbanx.UCS.WorkGroupMemberInfo
{
    [Guid("a54de6b6-6626-4e10-87d8-d402db923d11")]
    public class WorkGroupMember : System.Web.UI.WebControls.WebParts.WebPart
    {
        private TreeView tv;
        private string spsiteUrl;
        [WebBrowsable,
        Personalizable (PersonalizationScope.Shared ),
        Category("设置"),
        WebDescription("SPSiteUrl"),
        WebDisplayName("SPSiteUrl")]
        public string SPSiteUrl
        {
            get { return this.spsiteUrl; }
            set { this.spsiteUrl = value; }
        }
        private string domainUrl;
        [WebBrowsable,
        Personalizable(PersonalizationScope.Shared),
        Category("设置"),
         WebDescription("SPDomainUrl"),
         WebDisplayName("SPDomainUrl")]
        public string SPDomainUrl
        {
            get { return this.domainUrl; }
            set { this.domainUrl = value; }
        }
        private string spwebUrl;
        [WebBrowsable,
        Personalizable(PersonalizationScope.Shared),
        Category("设置"),
         WebDescription("SPWebUrl"),
         WebDisplayName("SPWebUrl")]
        public string SPWebUrl
        {
            get { return this.spwebUrl; }
            set { this.spwebUrl = value; }
        }
        private string isWGOrOUMember;
        [WebBrowsable,
        Personalizable(PersonalizationScope.Shared),
        Category("设置"),
        WebDescription("显示部门成员还是组织机构成员,1显示部门成员,2显示组织机构成员"),
        WebDisplayName("显示部门成员还是组织机构成员,1显示部门成员,2显示组织机构成员")]
        public string IsWGOrOUMember
        {
            get { return this.isWGOrOUMember; }
            set { this.isWGOrOUMember = value; }
        }
        private string listName;
        [WebBrowsable,
        Personalizable(PersonalizationScope.Shared),
        Category("设置"),
         WebDescription("存放部门或者组织机构的列表名称"),
         WebDisplayName("存放部门或者组织机构的列表名称")]
        public string ListName
        {
            get { return this.listName; }
            set { this.listName = value; }
        }
        private string ouOrWGName;
        [WebBrowsable,
        Personalizable(PersonalizationScope.Shared),
        Category("设置"),
        WebDescription(" 一级部门或者组织机构的名称"),
        WebDisplayName("一级部门或者组织机构的名称")]
        public string OuOrWGName
        {
            get { return this.ouOrWGName; }
            set { this.ouOrWGName = value; }
        }
        private int  swb;
        [WebBrowsable,
        Personalizable(PersonalizationScope.Shared),
        Category("设置"),
        WebDescription("学校测试用"),
        WebDisplayName("学校测试用")]
        public int  SWB
        {
            get { return this.swb; }
            set { this.swb = value; }
        }

public WorkGroupMember()
        {
            tv = new TreeView();
            
        }
        /// <summary>
        /// 获取部门全部成员,包括子部门成员
        /// 同时添加成员
        /// </summary>
        /// <param name="title">部门标题</param>
        /// <returns>部门全部成员,包括子部门成员的集合</returns>
        private void  getOUMembers(SPSite spsite,SPWeb spweb,SPList  ouList,SPFolder topFolder,TreeNode node)
        {
            TreeNode currOUNode;
                
                    spweb.Lists.IncludeRootFolder = true;

SPFolder folder =topFolder;

SPQuery query = new SPQuery();
                    query.Folder = folder;
                    query.Query = @"<Where>                                      <Eq>
                                         <FieldRef Name=‘ContentType‘ />
                                        <Value Type=‘Choice‘>Employee</Value>
                                      </Eq>
                                  </Where>";
                    query.ViewFields = "<FieldRef Name=‘Employee‘ /><FieldRef Name=‘Job‘ />";
                    SPListItemCollection  items = ouList.GetItems(query);
            
                    foreach (SPListItem item in items)
                    {
                        node.ChildNodes. Add(new TreeNode(  item.GetFormattedValue("Job")+": "+item.GetFormattedValue("Employee")));
                    }
                    if (folder.SubFolders.Count > 0)
                    {
                        foreach(SPFolder f in folder.SubFolders)
                        {
                            currOUNode = new TreeNode(f.Name,f.Name ,@"_LAYOUTS\2052\IMAGES\gfdx\OUImage.jpg");
                            node.ChildNodes.Add(currOUNode);
                            getOUMembers(spsite, spweb, ouList, f, currOUNode);
                        }
                    }
        }
        /// <summary>
        /// 获取部门SPFolder
        /// </summary>
        /// <param name="spsite"></param>
        /// <param name="spweb"></param>
        /// <param name="splist"></param>
        /// <param name="topFolder"></param>
        /// <param name="title"></param>
        /// <returns></returns>
        private SPFolder GetTopFolder(SPSite spsite, SPWeb spweb, SPList splist,SPFolder topFolder,string title)
        {
            SPFolder returnFolder = null ;

bool isTopFolder = false;
            foreach (SPFolder f in topFolder. SubFolders)
            {
                if (f.Name.Equals(ouOrWGName))
                {
                    returnFolder = f;
                    return returnFolder;
                }
            }
            if (returnFolder == null)
            {
                foreach (SPFolder f in topFolder.SubFolders)
                {
                    returnFolder = GetTopFolder(spsite, spweb, splist, f, title);
                    if (returnFolder != null)
                       return returnFolder;
                }
            }
            //returnFolder = splist.RootFolder.SubFolders[0].SubFolders[title];
            return returnFolder;
        }
        protected override void CreateChildControls()
        {
            base.CreateChildControls();

tv.Nodes.Clear();
            try
            {
                using (SPSite site = new SPSite(spsiteUrl ))
                {
                    using (SPWeb web = site.AllWebs[spwebUrl ])
                    {

web.Lists.IncludeRootFolder = true;

if (isWGOrOUMember.Equals("1"))
                        {
                            #region 显示一级部门成员
                            SPList ouList = web.Lists[listName];

SPFolder topFolder= GetTopFolder(site, web, ouList, ouList.RootFolder,ouOrWGName );
                            TreeNode ouNode = new TreeNode(ouOrWGName,ouOrWGName, @"_LAYOUTS\2052\IMAGES\gfdx\WGImage.jpg");
                            tv.Nodes.Add(ouNode);
                            getOUMembers(site, web, ouList, topFolder,ouNode );

#endregion
                        }
                        else if (isWGOrOUMember.Equals("2"))
                        {

#region 显示组织机构成员
                            SPList ouList = web.Lists[listName];

SPFolder folder = ouList.RootFolder.SubFolders[ouOrWGName];

TreeNode WGNode = new TreeNode(ouOrWGName, ouOrWGName, @"_LAYOUTS\2052\IMAGES\gfdx\WGImage.jpg");
                            tv.Nodes.Add(WGNode );

SPQuery query = new SPQuery();
                            query.Folder = folder;
                            query.Query = @"<Where>                                      <Eq>
                                         <FieldRef Name=‘ContentType‘ />
                                        <Value Type=‘Choice‘>WGMember</Value>
                                      </Eq>
                                  </Where>";
                            query.ViewFields = "<FieldRef Name=‘WGMemberWGDuty‘ /><FieldRef Name=‘WGMemberName‘ /><FieldRef Name=‘WGMemberDuty‘ />";
                            SPListItemCollection items = ouList.GetItems(query);
                            foreach (SPListItem item in items)
                            {

tv.Nodes[0].ChildNodes.Add(new TreeNode(item.GetFormattedValue("WGMemberWGDuty") + " " + item.GetFormattedValue("WGMemberName") + "职务:" +
                                    item.GetFormattedValue("WGMemberDuty")));
                            }
                           
                            #endregion
                        }
                         this.Controls.Add(tv);
                    }
                }
            }
            catch (Exception ex)
            {
                this.Controls.Add(new LiteralControl("请注意设置中的输入数据格式,错误提示:"+ex.Message));
            }
        }
    }
}

顺便在给大家贴上一段TreeViewDocLib,树形文档库的WebPart,网上找到的,也很好用。


using System;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Collections.Generic;
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;

namespace Kimbanx.UCS.TreeViewDocLib
{
    [Guid("b1882c89-e0da-4727-a414-c5622bfb1df3")]
    public class TreeViewDocLib : System.Web.UI.WebControls.WebParts.WebPart, IWebEditable
    {
        public System.Web.UI.WebControls.TreeView trv = new System.Web.UI.WebControls.TreeView();
        private TreeNode rNode;
        private SPWeb _web;
        private SPSite _site;
        private SPList _list;

public TreeViewDocLib()
        {
            this.ExportMode = System.Web.UI.WebControls.WebParts.WebPartExportMode.All;
        }

private string strLibName;
        private bool wpConfigured;

// Property to Assign _site library Name from Toolpart
        [WebBrowsable(true)]
        public string LibraryName
        {
            get
            {
                return strLibName;
            }
            set
            {
                strLibName = value;
            }
        }

protected override void Render(HtmlTextWriter writer)
        {
            // TODO: add custom rendering code here.
            // writer.Write("Output HTML");
        }

protected override void CreateChildControls()
        {
            // Verifying whether the WebPart is Configured in ToolPart
            if (!string.IsNullOrEmpty(LibraryName))
            {
                wpConfigured = true;
            }

if (wpConfigured)
            {
                //Creating the Instance of SPSite & SPWeb to open the _site
                _site = SPContext.Current.Site;
                _web = _site.OpenWeb();

// Fetching the Library Object from _site
                _list = _web.Lists[LibraryName];

// To Display Lines
                trv.ShowLines = true;

// Passing Root Node as the Parameter to Recursive Function
                rNode = new System.Web.UI.WebControls.TreeNode(_list.RootFolder.Name);
                TraverseFolder(_list.RootFolder, rNode);

// Adding the Root Node to Tree View
                trv.Nodes.Add(rNode);
                this.Controls.Add(trv);
            }
        }

protected override void RenderContents(HtmlTextWriter writer)
        {

}

public override void RenderControl(HtmlTextWriter writer)
        {
            //Rendering the Controls in WebPart Based on the Config
            if (wpConfigured)
                trv.RenderControl(writer);
            else
                writer.Write("<strong>Please Configure the Library Name in WebPart</strong>");
        }

public void TraverseFolder(SPFolder folder, TreeNode node)
        {
            
            TreeNode tNode = new System.Web.UI.WebControls.TreeNode(folder.Name);
            try
            {
                if (folder.Name != "Forms")
                {
                    // Looping all Folders in Current Folder
                    foreach (SPFolder fldr in folder.SubFolders)
                    {
                        if (fldr.Name != "Forms")
                        {
                            TreeNode trn = new System.Web.UI.WebControls.TreeNode(fldr.Name);
                            tNode = TraverseFiles(fldr, trn);
                            //trv.Nodes.Add(tNode);
                            rNode.ChildNodes.Add(tNode);
                        }
                    }

// Adding Files to the Tree Node
                    foreach (SPFile file in folder.Files)
                    {
                        TreeNode trnChild = new System.Web.UI.WebControls.TreeNode(file.Name, "", "~/_layouts/images/" + file.IconUrl, file.ServerRelativeUrl.ToString(), "");
                        rNode.ChildNodes.Add(trnChild);
                    }
                }
            }

catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }

public TreeNode TraverseFiles(SPFolder fldr, TreeNode node)
        {
            try
            {
                // Adding Files in the Current Folder
                foreach (SPFile file in fldr.Files)
                {
                    TreeNode trnChild = new System.Web.UI.WebControls.TreeNode(file.Name, "", "~/_layouts/images/" + file.IconUrl, file.ServerRelativeUrl.ToString(), "");
                    node.ChildNodes.Add(trnChild);
                }

// To Verify the Count of Sub Folders in Current Folder
                bool bRecurseFolders = fldr.SubFolders.Count > 0 ? true : false;

// If It has SubFolders Then it will call the Function Recursively
                if (bRecurseFolders)
                {
                    for (int i = 0; i < fldr.SubFolders.Count; i++)
                    {
                        TreeNode trnChild = new System.Web.UI.WebControls.TreeNode(fldr.SubFolders[i].Name);
                        node.ChildNodes.Add(TraverseFiles(fldr.SubFolders[i], trnChild));
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            return node;
        }

// Creating the ToolPart with the WebPart
        #region IWebEditable Members
        EditorPartCollection IWebEditable.CreateEditorParts ()
        {
            List<EditorPart> editors = new List<EditorPart>();
            editors.Add(new TreeViewEditorPart());
            return new EditorPartCollection(editors);
        }

object IWebEditable.WebBrowsableObject 
        {
            get { return this; }
        }
        #endregion
    }
}


using System;
using System.Collections.Generic;
using System.Text;

using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Kimbanx.UCS.TreeViewDocLib;

namespace Kimbanx.UCS.TreeViewDocLib
{
    public class TreeViewEditorPart : EditorPart
    {
        TextBox m_txtSiteURL;
        TextBox m_txtLibName;

public TreeViewEditorPart()
        {
            this.ID = "TreeViewEditorPart";
            this.Title = "UdayEth WebControls";
        }

// This Function will be Triggered When the Apply or OK button Clicked in ToolPart
        public override bool ApplyChanges()
        {
            TreeViewDocLib  part = WebPartToEdit as TreeViewDocLib;
            if (part != null)
            {
                part.LibraryName = m_txtLibName.Text;
                return true;
            }
            return true;
        }

// This Function will be Triggered when the Task Pane of the WebPart is Opened
        public override void SyncChanges()
        {
            EnsureChildControls();
            TreeViewDocLib part = WebPartToEdit as TreeViewDocLib;
            if (part != null)
            {
                m_txtLibName.Text = part.LibraryName;
            }
        }

protected override void CreateChildControls()
        {
            // Create new panel for ToolPart
            Panel userSectionBody = new Panel();

m_txtLibName = new TextBox();
            Label lblLibName = new Label();
            lblLibName.Text = "Document Library Name";

// Adding Site Library Name to Panel
            userSectionBody.Controls.Add(lblLibName);
            userSectionBody.Controls.Add(new LiteralControl("<BR>"));
            userSectionBody.Controls.Add(m_txtLibName);

Controls.Add(userSectionBody);
        }

protected override void RenderContents(HtmlTextWriter writer)
        {
            // Rendering Tool Part Pane
            writer.WriteLine("<b>Udayakumar Ethirajulu[SharePoint MVP]</b>");
            base.RenderContents(writer);
        }
    }
}

时间: 2024-08-13 03:15:01

Sharepoint中用treeview来显示组织机构的人员状态的webpart的相关文章

bash配置tmux来显示tmux ssh的状态

需求: 在tmux里面链接ssh的时候, 如果存在多个ssh主机, 想要显示对应的主机ip以示甄别 实现效果 编辑你的bashrc, 因为我习惯在root下操作, 所以/root/.bashrc, 你如果习惯用user, 那就编辑/home/你的用户名/.bashrc 增加 ssh() { if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then tmux rename-window "$

SCVMM中Clone虚拟机失败显示Unsupported Cluster Configuration状态

在SCVMM进行虚拟机的Clone,虽然失败了,但是Clone出虚拟机却显示在SCVMM控制台的虚拟机的列表中,并且状态是Unsupported Cluster Configuration.无法修复,甚至无法删除.解决方案是,直接操作数据库,更改其状态,然后删除. 在库VirtualManagerDB中找到表tbl_WLC_VObject,该表存储虚拟机对象.模板和快照等对象数据. 如上图ObjectState是255那么虚拟机将显示Unsupported Cluster Configurati

sharepoint 2013 修改某些显示名,email和活动目录不一致的账户 powershell

#该脚本修改某些显示名,email和活动目录不一致的账户Add-PSSnapin Microsoft.SharePoint.PowerShell $ConfirmPreference = 'None'  #关闭确认提示 $filePath="c:\file\" $allUsers=get-content C:\file\user.txt  -Encoding UTF8                   #从文件中读取需要迁移的账户,每一行包含账户和新的显示名称,新的email地址,字

SharePoint 2013 设置customErrors显示实际的错误信息

一.首先设置IIS中的Web.config文件 找到对应的IIS应用程序目录,如:C:\inetpub\wwwroot\wss\VirtualDirectories\3000 在此文件夹下包含一个web.config文件,打开找到<customErrors mode="On" />标签,改为<customErrors mode="Off" />: 然后找到<SafeMode MaxControls="200" Cal

SharePoint 2013 关于自定义显示列表表单的bug

1.在SharePoint 2013中,我们隐藏列表Dispform页面的ListFormWebPart部件,转而使用自定义显示列表表单进行展示,因为这样更容易定制我们需要的显示: 2.之后发现文件夹下的文档,查看属性会报错,如下图: 3.报错如下图,没有项目: 4.不在文件夹下的项目,就没有这样的问题,怀疑是获取CurrentItem出问题了,但是没想到怎么去改xslt,如下图: 5.百度谷歌查找解决方案,最后找到定义列表模板,参考jianyi的博客,如下图: 6.然后发现处在文件夹下的ID为

sharepoint 2007 column不显示delete

在某个list中新增加了一个column类型为Hyperlink or Picture,发现建好后,再编辑,没有delete选项. 使用spcamleditor 修改该column属性sealed 为 False 第一次修改报错,关闭spcamleditor,然后再修改一次,成功.然后就可以删除了. 在此方法之前,通过在 List Content Type 中将该column隐藏来达到不显示的目的. 方法二,直接修改数据库(不推荐): column的值存在系统表中,可以通过命令查看sql数据库中

几个数据库的小案例(三):用递归实现TreeView层级显示

从这个小案例我学到了不少知识.这些无论如何无法从书里得来.正所谓实践出真知,学习编程需要大量实践这句话永不过时. 首先:好的代码和坏的代码带来的性能上的差异很明显.好的策略可以让你的程序运行速度大大加快.而差的代码则能让你的程序直接卡死. 这是我写的递归填充TreeView: private void GetNode1(TreeNode tNod, int id) { using (SqlConnection conn = new SqlConnection("server=.\\sqlexpr

【解决】SharePoint Foundation 2013 未显示搜索框

在正确安装 SharePoint Foundation 2013 后会发现页面中缺少搜索框. 经查询网页了解到这是一个Bug,而且在 SP1 中也没有修复,所以即便是安装了 SP1 补丁的系统也需要下载如下补丁解决此问题: http://support.microsoft.com/kb/2760625 在补丁安装完成后,注意需要重新运行产品配置向导. 参见:http://www.sharepointblogs.be/blogs/vandest/archive/2013/12/10/sharepo

sharepoint 中用自带的download.aspx实现文件的下载,中文文件名编码的问题

//下面代码中的主要是为了将数据绑定到repeater上,同时实现文件的下载,其中dr[3]中的路径绑定的是下载路径,用到了sharepoint中自带的download.aspx下载页面,只要将文件的URL赋值给sourceurl即可,但是我前台用的是<a>标签的href来导向下载页面的,如果你的文件名是中文命名,而且路径是在后台传的值,在前台的进行的链接,那么如果你用的是IE浏览器,那么下载时就无法成功,因为IE无法将路径进行编码,下载页面无法识别中文名,所以这时就必须先编码再链接,如下面的