博客地址 http://blog.csdn.net/foxdave

此文参考自->原文链接

版权归原作者所有,我只是进行一下大致的翻译

应坛友要求,帮助验证一下功能。

SharePoint列表数据的树视图结构

1. 创建一个自定义列表,名字就还叫“CategoryDetails”这个吧,我喜欢用规范的英语。

2. 创建两个字段“Category Name”和“Parent Category”,在这里实际上就是ID和ParentID的概念,一个树,自然要有这种层级结构。

第一个字段为文本类型,类似PK的概念,必填且唯一

第二个字段为查阅项,自连接,如上所述。

字段创建完之后我们做一些测试的数据。

4. 部署WebPart解决方案,稍后附上树控件后台代码,原网站上有下载链接,直接下载下来,指定Site URL,修改后部署即可。

在页面上添加该WebPart,显示树状视图

坛友说的不好用实际上是因为字段的名称导致的,在创建字段的时候有空格,那么在用Query查询的时候,需要把空格替换为_x0020_。

后台代码如下

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using System.Text;
using System.Collections.Generic;
using System.Web; namespace TreeView.TreeStructure
{
public partial class TreeStructureUserControl : UserControl
{
public const string DYNAMIC_CAML_QUERY = "<Where><IsNull><FieldRef Name='{0}' /></IsNull></Where>";
public const string DYNAMIC_CAML_QUERY_GET_CHILD_NODE = "<Where><Eq><FieldRef Name='{0}' /><Value Type='LookupMulti'>{1}</Value></Eq></Where>";
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{ BuildTree(); }
}
protected void BuildTree()
{
SPList TasksList;
SPQuery objSPQuery;
StringBuilder Query = new StringBuilder();
SPListItemCollection objItems;
string DisplayColumn = string.Empty;
string Title = string.Empty;
string[] valueArray = null;
treeViewCategories.Nodes.Clear();
try
{
using (SPSite site = new SPSite(SPContext.Current.Web.Url))
{
using (SPWeb web = site.OpenWeb())
{ TasksList = SPContext.Current.Web.Lists["CategoryDetails"];
if (TasksList != null)
{ objSPQuery = new SPQuery();
Query.Append(String.Format(DYNAMIC_CAML_QUERY, "Parent_x0020_Category"));
objSPQuery.Query = Query.ToString();
objItems = TasksList.GetItems(objSPQuery);
if (objItems != null && objItems.Count > 0)
{
foreach (SPListItem objItem in objItems)
{
DisplayColumn = Convert.ToString(objItem["Category_x0020_Name"]);
Title = Convert.ToString(objItem["Category_x0020_Name"]);
CreateTree(Title, valueArray, null, DisplayColumn, objItem["ID"].ToString());
}
} }
}
} }
catch (Exception ex)
{
throw ex;
} }
private void CreateTree(string RootNode, string[] valueArray, List<SPListItem> objNodeCollection, string DisplayValue, string KeyValue)
{ string objExpandValue = string.Empty;
TreeNode objTreeNode;
TreeNodeCollection objChildNodeColn;
try
{ objTreeNode = new TreeNode(DisplayValue, KeyValue);
treeViewCategories.Nodes.Add(objTreeNode);
objTreeNode.CollapseAll();
objChildNodeColn = GetChildNode(RootNode, valueArray, objNodeCollection);
foreach (TreeNode childnode in objChildNodeColn)
{
objTreeNode.ChildNodes.Add(childnode); } }
catch (Exception ex)
{
throw ex;
}
} private TreeNodeCollection GetChildNode(string RootNode, string[] valueArray, List<SPListItem> objListItemColn)
{
TreeNodeCollection childtreenodes = new TreeNodeCollection();
SPQuery objSPQuery;
SPListItemCollection objItems = null;
List<SPListItem> objNodeListItems = new List<SPListItem>();
SiteMapNodeCollection objNode = new SiteMapNodeCollection();
objSPQuery = new SPQuery();
string objNodeTitle = string.Empty;
string objLookupColumn = string.Empty;
StringBuilder Query = new StringBuilder();
SPList objTaskList;
SPField spField;
string objKeyColumn; try
{ objTaskList = SPContext.Current.Web.Lists["CategoryDetails"];
objLookupColumn = "Parent_x0020_Category";//objTreeViewControlField.ParentLookup; spField = SPContext.Current.Web.Lists["CategoryDetails"].Fields["Parent Category"]; Query.Append(String.Format(DYNAMIC_CAML_QUERY_GET_CHILD_NODE, spField.InternalName, RootNode));
objSPQuery.Query = Query.ToString(); objItems = objTaskList.GetItems(objSPQuery);
foreach (SPListItem objItem in objItems)
{
objNodeListItems.Add(objItem);
} if (objNodeListItems != null && objNodeListItems.Count > 0)
{
foreach (SPListItem objItem in objNodeListItems)
{
RootNode = Convert.ToString(objItem["Category_x0020_Name"]);
objKeyColumn = Convert.ToString(objItem["ID"]); objNodeTitle = Convert.ToString(objItem["Category_x0020_Name"]);
if (!String.IsNullOrEmpty(objNodeTitle))
{
TreeNode childNode = new TreeNode();
childNode.Text = objNodeTitle;
childNode.Value = objKeyColumn;
childNode.CollapseAll();
foreach (TreeNode cnode in GetChildNode(RootNode, valueArray, objListItemColn))
{
childNode.ChildNodes.Add(cnode); }
childtreenodes.Add(childNode);
}
}
} }
catch (Exception ex)
{ throw ex;
}
return childtreenodes;
// Call method again (recursion) to get the child items
} }
}

That's all, thanks.

Build Tree View Structure for SharePoint List Data的更多相关文章

  1. LeetCode208 Implement Trie (Prefix Tree). LeetCode211 Add and Search Word - Data structure design

    字典树(Trie树相关) 208. Implement Trie (Prefix Tree) Implement a trie with insert, search, and startsWith  ...

  2. 多层json的构造,取值,还有使用bootstrap的tree view在前端展示的相关问题

    bootstrap-tree view是一款非常好用的插件,它可以添加任意多层节点,效果如下所示: 使用之前需要在HTML页面添加依赖文件: <link href="bootstrap ...

  3. SAP CRM 树视图(TREE VIEW)

    树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...

  4. Angular实现递归指令 - Tree View

    在层次数据结构展示中,树是一种极其常见的展现方式.比如系统中目录结构.企业组织结构.电子商务产品分类都是常见的树形结构数据. 这里我们采用Angular的方式来实现这类常见的tree view结构. ...

  5. delphi 保存 和 打开 TREE VIEW的节点已经展开的状态

    保存 和 打开 TREE VIEW的节点已经展开的状态 如果每次打开后能自动读取上次展开的状态就会非常快捷 下载地址: 实现方法 将已经展开的节点索引 放在一个文本中最后选中的那个节点索引放在最后一位 ...

  6. [UE4]Tree View

    类似List View,但Tree View要求提供树形结构的数据.Tree View和Tile View都是继承自List View 一.创建一个名为“TreeEntry”的UserWidget,添 ...

  7. 使用 Build Pipeline View 插件图表展示Jenkins job依赖关系

    使用 Build Pipeline View 查看Jenkins的Job的依赖关系图表 安装 Build Pipeline View 插件下载地址 下载后再jenkins的"插件管理&quo ...

  8. OpenERP how to set the tree view limit

    return { 'name':u'库存报表', 'view_type':'form', 'view_mode':'tree,form', 'res_model':'rainsoft.account. ...

  9. iphone dev 入门实例1:Use Storyboards to Build Table View

    http://www.appcoda.com/use-storyboards-to-build-navigation-controller-and-table-view/ Creating Navig ...

随机推荐

  1. leetcode——Search for a Range 排序数组中寻找目标下标范围(AC)

    Given a sorted array of integers, find the starting and ending position of a given target value. You ...

  2. Linux中的Buffer Cache和Page Cache echo 3 > /proc/sys/vm/drop_caches Slab内存管理机制 SLUB内存管理机制

    Linux中的Buffer Cache和Page Cache echo 3 > /proc/sys/vm/drop_caches   Slab内存管理机制 SLUB内存管理机制 http://w ...

  3. centos单用户 救援 运行级别 yum,单用户模式,救援模式,inittab :启动级别 e2fsck wetty mingetty 物理终端 /dev/console 虚拟终端 /dev/tty(0,6) 模拟终端 /dev/pts/# grub-md5-crypt 给grub加密码 initrd 第二节课

    centos单用户 救援 运行级别  yum,单用户模式,救援模式,inittab :启动级别  e2fsck  wetty  mingetty  物理终端 /dev/console  虚拟终端 /d ...

  4. [WorldWind学习]19.WebDownload

    using System; using System.Diagnostics; using System.Globalization; using System.Net; using System.I ...

  5. 安装完C++builder6.0启动的时候总是出现无法将'C:\Program Files\Borland\CBuilder6\Bin\bcb.$$$'重命名为bcb.dro

    :兼容性问题  运行前右键属性“兼容性”-尝试不同的兼容性.比如“windows 8”

  6. FTP服务器配置实践

    1.为linux系统分配IP地址:192.168.X.1/24,并重启网络服务,客户端XP系统IP地址为:192.168.X.2/24, 2.查询本机是否安装了vsftpd服务,结果显示未安装,挂载光 ...

  7. Java与Flex学习笔记(20)---将flex页面嵌入到jsp页面中

    如果我们只需要用到Flex的一部分功能,例如播放器功能,我们可以单独把Flex页面嵌入到Jsp页面中.要想实现此功能,需要下载一个工程,将其覆盖在服务器根目录下即可.你可以在次下载:FlexModul ...

  8. Python3.x:requests的用法

    Python3.x:requests的用法 1,requests 比 urllib.request 容错能力更强: 2,通常用法: (1).认证.状态码.header.编码.json r = requ ...

  9. ZLYD团队第三周项目总结

    ZLYD团队第三周项目总结 项目进展 我们的吃豆子游戏的程序由八个文件组成:Wall.java.Gold.java.Player.java.Fruit.java.Enemy.java.Ticker.j ...

  10. Duilib应用修改程序图标方法

    本文向大家介绍如何修改duilib应用图标,对于win32或者mfc应用来说,我们可以在注册窗口类时指定WNDCLASS结构体的HIcon属性.那么duilib应用该怎样处理呢?大家都知道Window ...