我正在尝试按代码连接内容类型,(不要问为什么),哈哈。该功能正常,新列可以很好地添加到视图中。
出于某种原因,在NEW或Edit表单中,不存在新的Field Source Name。当我进入列表设置,高级时,它显示管理内容类型=否,但我在代码上将其设置为是。
我没有想法。
private static void RemoveProductListAndCreateProductAndSourceList(SPWeb currentWeb)
{
currentWeb.AllowUnsafeUpdates = true;
#region Adds/Removes the product and source list
if (currentWeb.Lists.TryGetList(SponsoringCommon.Constants.LISTNAMES_PRODUCT_NAME) != null)
{
currentWeb.Lists.TryGetList(SponsoringCommon.Constants.LISTNAMES_PRODUCT_NAME).Delete();
currentWeb.Lists.Add(SponsoringCommon.Constants.LISTNAMES_PRODUCT_NAME, string.Empty, SPListTemplateType.GenericList);
}
if (currentWeb.Lists.TryGetList(SponsoringCommon.Constants.LISTNAMES_SOURCES_NAME) != null)
{
currentWeb.Lists.TryGetList(SponsoringCommon.Constants.LISTNAMES_SOURCES_NAME).Delete();
currentWeb.Lists.Add(SponsoringCommon.Constants.LISTNAMES_SOURCES_NAME, string.Empty, SPListTemplateType.GenericList);
}
else
{
currentWeb.Lists.Add(SponsoringCommon.Constants.LISTNAMES_SOURCES_NAME, string.Empty, SPListTemplateType.GenericList);
}
#endregion
#region HIde the title columns
SPList productList = currentWeb.Lists.TryGetList(SponsoringCommon.Constants.LISTNAMES_PRODUCT_NAME);
SPField titleField = productList.Fields.GetField("Title");
titleField.ShowInEditForm = false;
titleField.ShowInDisplayForm = false;
titleField.ShowInNewForm = false;
titleField.Update();
SPList sourceList = currentWeb.Lists.TryGetList(SponsoringCommon.Constants.LISTNAMES_SOURCES_NAME);
titleField = sourceList.Fields.GetField("Title");
titleField.ShowInEditForm = false;
titleField.ShowInDisplayForm = false;
titleField.ShowInNewForm = false;
titleField.Update();
#endregion
#region Add Source content type if it doesnt exist.
SPContentType sourceContentType = currentWeb.ContentTypes[SponsoringCommon.Constants.CONTENTTYPES_SOURCES_NAME];
SPContentTypeId sourceContentTypeid = new SPContentTypeId(SponsoringCommon.Constants.CONTENTTYPES_SOURCE_ID);
if (sourceContentType == null)
{
sourceContentType = new SPContentType(sourceContentTypeid,
currentWeb.ContentTypes,
SponsoringCommon.Constants.CONTENTTYPES_SOURCES_NAME);
currentWeb.ContentTypes.Add(sourceContentType);
}
#endregion
#region Removes the link from the content type column called Product Name
SPContentType productCT = currentWeb.ContentTypes[SponsoringCommon.Constants.CONTENTTYPES_PRODUCT_NAME];
productCT.DeleteFieldRefFromContentType(currentWeb.Fields[SponsoringCommon.Constants.FIELDS_PRODUCT_NAMEOLD]);
#endregion
#region New fields properties
SPFieldCurrency amountField = (SPFieldCurrency)currentWeb.Fields.GetFieldByInternalName(SponsoringCommon.Constants.FIELDS_PRICE_NAME);
amountField.ShowInNewForm = true;
amountField.ShowInEditForm = true;
amountField.ShowInDisplayForm = true;
string productFieldName = currentWeb.Fields.Add(SponsoringCommon.Constants.FIELDS_PRODUCT_NAMENEW, SPFieldType.Text, true);
SPField productField = currentWeb.Fields.GetFieldByInternalName(productFieldName);
productField.Group = "$Resources:SPNLSponsoring,Field_NationaleLoterijSponsoringColumns_Group";
string schemaXmlWithResourceTokens = productField.SchemaXmlWithResourceTokens;
int startIndex = schemaXmlWithResourceTokens.IndexOf("\"", schemaXmlWithResourceTokens.IndexOf("DisplayName=\"")) + 1;
int endIndex = schemaXmlWithResourceTokens.IndexOf("\"", startIndex);
int substringLength = endIndex - startIndex;
string value = @"DisplayName=\" + schemaXmlWithResourceTokens.Substring(startIndex, substringLength);
schemaXmlWithResourceTokens = schemaXmlWithResourceTokens.Replace(value, @"DisplayName=\$Resources:SPNLSponsoring,Field_Product_Name");
productField.SchemaXml = schemaXmlWithResourceTokens;
productField.ShowInNewForm = true;
productField.ShowInEditForm = true;
productField.ShowInDisplayForm = true;
SPFieldLink fieldLinkProductName = new SPFieldLink(productField);
SPFieldLink fieldLinkPriceName = new SPFieldLink(amountField);
productCT.FieldLinks.Add(fieldLinkProductName);
productCT.FieldLinks.Reorder(new string[] {productField.InternalName,amountField.InternalName}); //Reorder fields in the content type
productCT.Update(true);
productList.ContentTypesEnabled = true;
productList.ContentTypes.Add(productCT);
SPContentTypeCollection currentOrder = productList.ContentTypes;
List<SPContentType> result = new List<SPContentType>();
foreach (SPContentType ct in currentOrder)
{
if (ct.Name.Contains(SponsoringCommon.Constants.CONTENTTYPES_PRODUCT_NAME))
{
result.Add(ct);
}
}
productList.RootFolder.UniqueContentTypeOrder = result;
productList.RootFolder.Update();
#endregion
string sourceFieldName = currentWeb.Fields.Add(SponsoringCommon.Constants.FIELDS_SOURCE_NAME, SPFieldType.Text, true);
SPField sourceField = currentWeb.Fields.GetFieldByInternalName(sourceFieldName);
sourceField.Group = "$Resources:SPNLSponsoring,Field_NationaleLoterijSponsoringColumns_Group";
schemaXmlWithResourceTokens = sourceField.SchemaXmlWithResourceTokens;
startIndex = schemaXmlWithResourceTokens.IndexOf("\"", schemaXmlWithResourceTokens.IndexOf("DisplayName=\"")) + 1;
endIndex = schemaXmlWithResourceTokens.IndexOf("\"", startIndex);
substringLength = endIndex - startIndex;
value = @"DisplayName=\" + schemaXmlWithResourceTokens.Substring(startIndex, substringLength);
schemaXmlWithResourceTokens = schemaXmlWithResourceTokens.Replace(value, @"DisplayName=\$Resources:SPNLSponsoring,Field_Source_Name");
sourceField.SchemaXml = schemaXmlWithResourceTokens;
sourceField.ShowInEditForm = true;
sourceField.ShowInNewForm = true;
sourceField.ShowInDisplayForm = true;
SPFieldLink fieldLinkSourceName = new SPFieldLink(sourceField);
sourceContentType.FieldLinks.Add(fieldLinkSourceName);
sourceContentType.Update(true);
sourceList.ContentTypesEnabled = true;
sourceContentType.Update(true);
sourceList.ContentTypes.Add(sourceContentType);
SPContentTypeCollection currentOrderSourceList = sourceList.ContentTypes;
List<SPContentType> resultSourceList = new List<SPContentType>();
foreach (SPContentType ct in currentOrderSourceList)
{
if (ct.Name.Contains(SponsoringCommon.Constants.CONTENTTYPES_SOURCES_NAME))
{
resultSourceList.Add(ct);
}
}
sourceList.RootFolder.UniqueContentTypeOrder = resultSourceList;
sourceList.RootFolder.Update();
#region Modify views.
SPView vwAllItemsProductList = productList.GetSafeViewByName(SponsoringCommon.Constants.VIEWS_ALL_ITEMS);
SPViewFieldCollection colvwAllItemsProductList = vwAllItemsProductList.ViewFields;
if (vwAllItemsProductList.ViewFields.Exists("LinkTitle"))
{
vwAllItemsProductList.ViewFields.Delete("LinkTitle");
}
colvwAllItemsProductList.Add(productField);
colvwAllItemsProductList.Add(amountField);
vwAllItemsProductList.Update();
SPView vwAllItemsSourceList = sourceList.GetSafeViewByName(SponsoringCommon.Constants.VIEWS_ALL_ITEMS);
SPViewFieldCollection colvwAllItemsSourceList = vwAllItemsSourceList.ViewFields;
if (vwAllItemsSourceList.ViewFields.Exists("LinkTitle"))
{
vwAllItemsSourceList.ViewFields.Delete("LinkTitle");
}
colvwAllItemsSourceList.Add(sourceField);
vwAllItemsSourceList.Update();
#endregion
currentWeb.AllowUnsafeUpdates = false;
}
答案 0 :(得分:0)
sourceList.ContentTypesEnabled = true;
sourceContentType.Update(true);
//Update the sourceList here this before you add the CT
sourceList.ContentTypes.Add(sourceContentType);
答案 1 :(得分:0)
问题在于,当我创建内容类型时,它基于Document而不是item,因此我将该部分更改为this并且它有效。
SPContentType itemCtype = currentWeb.AvailableContentTypes[SPBuiltInContentTypeId.Item];
SPContentType sourceContentType = new SPContentType(itemCtype, currentWeb.ContentTypes, SponsoringCommon.Constants.CONTENTTYPES_SOURCES_NAME);
sourceContentType = currentWeb.ContentTypes.Add(sourceContentType);