您的位置:首页 > 其它

为SharePoint列表数据创建树视图结构

2014-04-25 23:39 302 查看
        为SharePoint列表数据创建树视图结构

        在我们的项目中,我们有个要求,所有类别/子类别详细信息将在名为CategoryDetails的列表中储存。需要以树视图展示给终端用户。

1. 创建自定义列表CategoryDetails
2. 创建栏目Category Name,类型单行文本,必填,强制唯一值。创建后效果图:



3. 创建栏目Parent Category,类型查阅项,在其他栏设置下,信息来源选择CategoryDetails,此栏包含选择Category Name。



4. 样例列表数据。



5. 现在我们看看创建树结构的代码,使用ASP树视图控件。

        创建空白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_,即解决问题。这里附上他的博客链接
        论坛的朋友也给出了原因,参考链接

        本机效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐