当我尝试按代码创建内容类型和列表时,新表单我看不到新字段

时间:2012-07-25 09:30:02

标签: c# sharepoint

当我尝试按代码创建内容类型和列表时,新表单我看不到新字段。 我不知道还有什么要检查,我在其他博客文章的基础上构建了这段代码。

 public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
            Logger.LogDebug("NLSponsoringListSalesNumbersEventReceiver", "FeatureActivated(SPFeatureReceiverProperties properties)", "BEGIN");
            try
            {
                SPSite currentSite = properties.Feature.Parent as SPSite;
                SPWeb currentWeb = currentSite.RootWeb;
                AddSourcesList(currentWeb);



     private void AddSourcesList(SPWeb currentWeb)
        {
            currentWeb.AllowUnsafeUpdates = true;

            #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);
                    currentWeb.Update();
                }
            #endregion

            #region Removes list if it exists
                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 Hides title column
            SPList sourceList = currentWeb.Lists.TryGetList(SponsoringCommon.Constants.LISTNAMES_SOURCES_NAME);
            SPField titleField = sourceList.Fields.GetField("Title");
            titleField.ShowInEditForm = false;
            titleField.ShowInDisplayForm = false;
            titleField.ShowInNewForm = false;
            titleField.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";
            string schemaXmlWithResourceTokens = sourceField.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_Source_Name");
            sourceField.SchemaXml = schemaXmlWithResourceTokens;
            sourceField.ShowInEditForm = true;
            sourceField.ShowInNewForm = true;
            sourceField.ShowInDisplayForm = true;

            SPFieldLink fieldLinkSourceName = new SPFieldLink(sourceField);
            sourceContentType.FieldLinks.Add(fieldLinkSourceName);
            sourceContentType.FieldLinks.Reorder(new string[] { sourceField.InternalName });  //Reorder fields in the content type  
            sourceList.ContentTypesEnabled = true;
            sourceList.ContentTypes.Add(sourceContentType);
            sourceList.Update();

            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 view all items to show the new field
                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 ;
        }

1 个答案:

答案 0 :(得分:1)

问题是因为默认情况下添加的内容类型是基于Document而不是类型。

我把那部分改成了这个

  SPContentType itemCtype = currentWeb.AvailableContentTypes[SPBuiltInContentTypeId.Item];
                SPContentType sourceContentType = new SPContentType(itemCtype, currentWeb.ContentTypes, SponsoringCommon.Constants.CONTENTTYPES_SOURCES_NAME);
                sourceContentType = currentWeb.ContentTypes.Add(sourceContentType);

然后它运作良好