我需要一些关于如何恢复其某个sharepoint列表的查阅列值的帮助。
方案: 我有2个共享点列表。 LIST1 列表2
LIST1有一个类型为Extended Lookup Field的列A,它引用了LIST2的A列。
最近,我在LIST2中添加了另一个字段。然后我执行,停用/激活|卸载/安装LIST2。
现在<问题是A列的参考查询 - LIST1到A列 - LIST2丢失了。 在编辑A-LIST1列之前,有以下信息:
从以下地址获取信息: a栏 - LIST2
现在,它只是空白......
答案 0 :(得分:1)
LookupList属性包含LIST2原始实例的GUID。如果删除了LIST2并创建了新实例,则新LIST2将具有不同的GUID,并且LIST1上的查找字段将不起作用。
而且,遗憾的是,LookupList
无法直接更改:
SPException:该属性已设置。设置LookupList属性后,您无法更改查找列表。
但是,您可以尝试以下方法:
Type type = typeof(SPFieldLookup);
object obj = type.InvokeMember("SetFieldAttributeValue",
BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,
null,
myLookupField,
new object[] { "List", guidOfNewList.ToString() });
myLookupField.Update();
使用反射,您可以尝试调用内部SetFieldAttributeValue方法并更改“{”属性,这是LookupList
属性使用的属性。
答案 1 :(得分:1)
这是另一种可能用于重置目标Web和列表的方法。代码放在扩展方法中。我从其他一些互联网帖子中得到了基本的想法:
扩展方法,使用字符串操作修改XML: http://blogs.edwardwilde.com/2010/02/08/cannot-change-the-lookup-list-of-the-lookup-field/
使用XmlDocument的代码片段: http://social.msdn.microsoft.com/Forums/sharepoint/en-US/f5c421a2-ca88-414e-9110-2b8ecb716e54/reattach-a-sharepoint-list-lookup-column-to-the-source-list
对我的项目有用:
/// <summary>
/// Extension methods for SPField objects.
/// </summary>
public static class SPFieldLookupExtensions
{
/// <summary>
/// Updates a Lookup field's source list by directly manipulating the XML schema SharePoint uses for the field.
/// </summary>
/// <param name="lookupField">The field to be updated.</param>
/// <param name="list">The list that should be used by the lookup field.</param>
public static void UpdateLookupReferences(this SPFieldLookup lookupField, SPList list)
{
// whether or not the lookup field's list is in the same site as the target list
bool differentSite = lookupField.LookupWebId != list.ParentWeb.ID;
// whether or not the lookup field's target list is correctly set
bool differentList = lookupField.LookupList != list.ID.ToString();
if (!differentSite && !differentList)
{
// return if field's properties are already correct.
return;
}
if (string.IsNullOrEmpty(lookupField.LookupList) && (!differentSite || (differentSite && string.IsNullOrEmpty(lookupField.LookupWebId.ToStringNullSafe()))))
{
// if field has not been bound to anything, bind it now
if (differentSite)
{
lookupField.LookupWebId = list.ParentWeb.ID;
}
lookupField.LookupList = list.ID.ToString();
}
else
{
// field is incorrectly bound, fix it.
XmlDocument fieldSchema = new XmlDocument();
fieldSchema.LoadXml(lookupField.SchemaXml);
if (differentSite)
{
XmlAttribute webAttr = fieldSchema.DocumentElement.Attributes["WebId"];
if (webAttr == null)
{
webAttr = fieldSchema.CreateAttribute("WebId");
fieldSchema.DocumentElement.SetAttributeNode(webAttr);
}
webAttr.Value = list.ParentWeb.ID.ToString();
}
if (differentList)
{
XmlAttribute listAttr = fieldSchema.DocumentElement.Attributes["List"];
if (listAttr == null)
{
listAttr = fieldSchema.CreateAttribute("List");
fieldSchema.DocumentElement.SetAttributeNode(listAttr);
}
listAttr.Value = list.ID.ToString();
}
lookupField.SchemaXml = fieldSchema.InnerXml;
}
lookupField.Update(true);
}
}