为SharePoint列表数据创建树视图结构
在我们的项目中,我们有个要求,所有类别/子类别详细信息将在名为CategoryDetails的列表中储存。需要以树视图展示给终端用户。
1. 创建自定义列表CategoryDetails
创建空白SharePoint项目,添加可见Web部件TreeStructure。
代码首先寻找parent为null的项目。如China,India。
然后对每个顶级项目,子项目将使用查询语句获得。
同样的方法将被循环调用获得所有子项目。
在我们的项目中,我们有个要求,所有类别/子类别详细信息将在名为CategoryDetails的列表中储存。需要以树视图展示给终端用户。
1. 创建自定义列表CategoryDetails
2. 创建栏目Category Name,类型单行文本,必填,强制唯一值。创建后效果图:
3. 创建栏目Parent Category,类型查阅项,在其他栏设置下,信息来源选择CategoryDetails,此栏包含选择Category Name。
4. 样例列表数据。
创建空白SharePoint项目,添加可见Web部件TreeStructure。
代码首先寻找parent为null的项目。如China,India。
然后对每个顶级项目,子项目将使用查询语句获得。
同样的方法将被循环调用获得所有子项目。
在TreeStructureUserControl.ascx中添加一个Treeview控件。(注意更改ID)
TreeStructureUserControl.ascx.cs添加如下代码,并部署解决方案。
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 TreeViewForListData.TreeStructure
{
public partial class TreeStructureUserControl : UserControl
{
public const string DYNAMIC_CAML_QUERY = "
";
public const string DYNAMIC_CAML_QUERY_GET_CHILD_NODE = "
{1}
";
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
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
objListItemColn)
{
TreeNodeCollection childtreenodes = new TreeNodeCollection();
SPQuery objSPQuery;
SPListItemCollection objItems = null;
List
objNodeListItems = new List
();
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
}
}
}
现在添加Treestructure Web部件到页面,样例数据将显示在下边:(此图借用原文图片,我练习过程中出现了错误)
PS:我的错误原因,求高手解答,我也会自己琢磨一下的。
大虾可以看原文链接。
PS:
经过月飘冥的指点,
在代码里栏名中间空格换成_x0020_,即解决问题。这里附上他的
博客链接
论坛的朋友也给出了原因,
参考链接
本机效果图: