2012-03-06 4 views
1

Мне нужна помощь по восстановлению значения столбца поиска одного из моих списков sharepoint.Как сбросить значение LookUp в списке Sharepoint?

Сценарий: У меня есть 2 списка совпадений. LIST1 LIST2

LIST1 имеет столбец A с полем расширенного поиска типа, это относится к столбцу A LIST2.

В последнее время я добавил еще одно поле в LIST2. Затем я выполнил, деактивировать/активировать | удалить/установить LIST2.

СЕЙЧАС < проблема заключается в поиске ссылок столбца A - LIST1 TO столбец A - LIST2 был утерян. Перед тем при редактировании столбца A-LIST1, есть информация, записанная в:

Получить информацию от: колонки - list2

Теперь это просто пустые ...

+0

Вы можете опубликовать снимок экрана? –

ответ

1

Свойства LookupList содержит GUID исходного экземпляра LIST2. Если 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 и изменить «List» атрибут, который является тем, что используется LookupList собственности ,

1

Вот еще один способ, который может работать для сброса целевой сети и списка. Код помещается в метод расширения. Я получил основную идею от некоторых других интернет-сообщений:

метод расширения, модификации 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); 
    } 

} 
Смежные вопросы