Как я могу сбросить значение LookUp списка Sharepoint? - PullRequest
1 голос
/ 06 марта 2012

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

Сценарий: У меня есть 2 списка sharepoint. LIST1 List2

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

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

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

Получить информацию от: столбец А - СПИСОК2

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

Ответы [ 2 ]

1 голос
/ 12 августа 2013

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

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

}
1 голос
/ 07 марта 2012

Свойство 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метод и измените атрибут «Список», который используется свойством LookupList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...