我需要以编程方式检索Sharepoint文档库中的列,以便在Sharepoint外部设置文件属性。
我发现设置元数据属性并不难,只要你已经知道列的名称,我不能指望用户自己输入。
由于似乎无法通过Sharepoint Web Services执行此操作,因此我创建了自己的自定义Web服务,因此我可以访问客户端对象模型。
使用此代码,我可以检索自己创建的自定义列,但是我无法区分项目属性部分(上图)中可编辑的列和不可编辑的列。
SPList list = web.Lists[specificList];
foreach (SPField field in list.Fields)
{
if (!field.Hidden)
{
var title = field.Title;
var description = field.Description;
var parentList = field.ParentList;
var references = field.FieldReferences; // contains names of fields referenced in computed fields
if (references != null)
{
foreach (string reference in references)
{
var test = parentList.Fields.GetField(reference);
}
}
}
}
我获得了额外的属性,例如:
我也尝试从SPFolder项中检索列字段,但这又返回了许多额外的属性,甚至更少可过滤。
foreach (SPListItem folderItem in list.Folders)
{
SPFolder folder = folderItem.Folder;
System.Collections.Hashtable oHashtable = folder.Properties;
System.Collections.ICollection collKeys = oHashtable.Keys;
foreach (var key in collKeys)
{
string keyName = key.ToString();
}
}
是否有标准方法来检索我需要的列字段?或者我是否必须手动排除默认值,例如“Checked out to”?
答案 0 :(得分:1)
首先,您必须知道您正在查看哪种表格。是EditForm还是NewForm?
您可以通过获取ContentType的字段来过滤特定表单上可见的列,然后检查它们是否显示在NewForm(或任何表单)上:
SPList list = web.Lists[specificList];
var contentType = list.ContentTypes[0]; // Select first contenttype. Change this if you need a different contentType
foreach (SPField field in contentType.Fields)
{
if (!field.Hidden
&& (field.ShowInEditForm == null
|| !field.ShowInEditForm.Value)) // Replace ShowInEditForm with the form you need
{
var title = field.Title;
var description = field.Description;
var parentList = field.ParentList;
var references = field.FieldReferences; // contains names of fields referenced in computed fields
if (references != null)
{
foreach (string reference in references)
{
var test = parentList.Fields.GetField(reference);
}
}
}
}
答案 1 :(得分:0)
我认为最好的方法是从内容类型而不是列表本身获取字段。这样,您只能获得表单中可见的字段。
var list = web.Lists[specificList];
var contentType = list.ContentTypes["Document"];
foreach (SPField field in contentType.Fields)
{
if(!field.Reorderable || contentType.FieldLinks[field.Id].Hidden)
{
continue;
}
//Process fields
}
您可以问“为什么Reordable=false
?”。好吧,通常自定义字段不设置此属性,因此它是一种很好的过滤方式。
我也没有发明这段代码。此代码取自SharePoint标准内容类型字段重新排序页面后面的代码(使用反射)。