按代码创建内容类型。新表格为空

时间:2012-07-24 13:59:28

标签: c# sharepoint

我正在尝试按代码连接内容类型,(不要问为什么),哈哈。该功能正常,新列可以很好地添加到视图中。

出于某种原因,在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;

        }

2 个答案:

答案 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);