Проблема с добавлением поля в пользовательский тип списка в SharePoint
Я определил пользовательский тип шаблона списка для SharePoint. Я устанавливаю его, используя VSeWSS 1.3, и все, кажется, ведет себя правильно.
Я добавил пользовательское действие, которое добавит дополнительные столбцы (SPFields) в список. Однако каждый раз, когда этот код выполняется, он выдает и ArgumentException со значением "Значение не в ожидаемом диапазоне". сообщение об ошибке. Такое поведение, как представляется, характерно для пользовательских типов, как предлагается в этом сообщении в блоге.
Вот соответствующий код (thisList является экземпляром моего настраиваемого типа шаблона списка, созданного с помощью взаимодействия с браузером), который пытается добавить поле в SPFieldCollection thisList:
SPFieldType fieldType = Format2SPFieldType(format);
SPField field = new SPField(thisList.Fields, fieldType.ToString(), fieldName);
thisList.Fields.Add(field);
Последний оператор (thisList.Fields.Add(field)) выдает следующее исключение:
Message "Value does not fall within the expected range."
at Microsoft.SharePoint.SPFieldCollection.GetFieldByInternalName(String strName, Boolean bThrowException)
at Microsoft.SharePoint.SPFieldCollection.GetFieldByInternalName(String strName)
at Microsoft.SharePoint.SPFieldCollection.AddFieldAsXmlInternal(String schemaXml, Boolean addToDefaultView, SPAddFieldOptions op)
at Microsoft.SharePoint.SPFieldCollection.AddFieldAsXml(String schemaXml, Boolean addToDefaultView, SPAddFieldOptions op)
at Microsoft.SharePoint.SPFieldCollection.Add(SPField field)
Этот же код выполняется просто отлично, если элемент SPList является базовым типом списка (встроенный пользовательский список).
Есть ли какие-либо поля, которые нужно явно установить в CAML и напрямую использовать метод AddFieldAsXml(), чтобы этот код работал с пользовательскими типами шаблонов списков?
Обновление: я должен также упомянуть, что поля действительно создаются в некоторых случаях, даже если вызов вызывает исключение!
2 ответа
Оказывается, это было вызвано тем, что вызов thisList.SchemaXML переводит объект SPList в состояние, из которого я не смог восстановиться! Получение новой ссылки на тот же список SharePoint, например, SPList newList=thisList.ParentWeb.Lists[thisList.ID] решило проблему!
Какой тип поля вы пытаетесь добавить? Это внутреннее поле или тип пользовательского поля, что возвращает эта функция Format2SPFieldType? Если это встроенное поле, вы можете попробовать добавить с
thisList.Fields.Add("DisplayName", SPFieldType.Integer, false);