Thursday, March 2, 2017

Programmatically creating a field from the Custom field type

Environment: SharePoint Server 2013
Requirement: Programmatically create a field/column from a custom field type.


Following is a simple example with sample code to create a field from custom field type. In this example we are creating a custom field type (derived from SPFieldNumber) and add it to document library.

Note: I would recommend to refer to this MSDN post before this post to understand the entire steps involved to create a custom field type.


Creating the Custom Field Class.
The following example defines a custom control for displaying the custom field of type SPFieldNumber. The example overrides the OnAdded method to contain the logic while adding the custom field type in library/list.


using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Prasath.SP
{
   class SampleHitCountField: SPFieldNumber
   {
       public SampleHitCountField(SPFieldCollection fields, string fieldName)
           : base(fields, fieldName)
       {
       }


       public SampleHitCountField(SPFieldCollection fields, string typeName, string displayName)
           : base(fields, typeName, displayName)
       {
       }


       //Event triggered when new field is added to the document library
       public override void OnAdded(SPAddFieldOptions op)
       {
           base.OnAdded(op);
           Update();


           //Hide the field from new and edit form
           this.ShowInEditForm = false;
           this.ShowInNewForm = false;
           this.DefaultValue = "0";
           this.EnforceUniqueValues = false;
           this.Required = false;
           this.Update();
       }
   }
}


Creating the Field Type Definition
The following example registers the custom field type. This file must be named in the format fldtypes*.xml


<?xml version="1.0" encoding="utf-8" ?>
<FieldTypes>
 <FieldType>
   <Field Name="TypeName">SampleHitCountField</Field>
   <Field Name="TypeDisplayName">Total View Count</Field>
   <Field Name="InternalType">SampleHitCountField</Field>
   <Field Name="TypeShortDescription">Total View Count</Field>
   <Field Name="FieldTypeClass">Prasath.SP.SampleHitCountField, $SharePoint.Project.AssemblyFullName$</Field>
   <Field Name="ParentType">Number</Field>
   <Field Name="Sortable">TRUE</Field>
   <Field Name="Filterable">TRUE</Field>
   <Field Name="UserCreatable">TRUE</Field>
   <Field Name="ShowOnListCreate">FALSE</Field>
   <Field Name="ShowOnSurveyCreate">FALSE</Field>
   <Field Name="ShowOnDocumentLibrary">TRUE</Field>
   <Field Name="ShowOnColumnTemplateCreate">TRUE</Field>
   <Field Name="ShowInListSettings">TRUE</Field>
 </FieldType>
</FieldTypes>


Creating a Field from custom Field Type
Following is the method to create field from custom type
/// <summary>
       /// Create custom field as XML
       /// </summary>
       /// <param name="oId">Field GUID</param>
       /// <param name="strDisplayName">Unique Display Name of field</param>
       /// <param name="Required">Field required property</param>
       /// <param name="strFieldType">Custom field type</param>
       /// <param name="strFieldName">Custom field display name</param>
       /// <returns>string</returns>
       internal static string GetCreateFieldAsXml(Guid oId, string strDisplayName, bool Required, string strFieldType, string strFieldName)
       {
           XmlElement element = new XmlDocument().CreateElement("Field"); // Creating the “Field” element for the Inner XML schema
           element.SetAttribute("ID", oId.ToString()); // Setting the GUID of the field from value passed
           element.SetAttribute("Type", strFieldType); // Setting the Parent Type name of custom type registered in the “Fldtypes*.xml” file
           element.SetAttribute("Name", strFieldName); // Setting the Type Display Name registered in the “Fldtypes*.xml” file
           element.SetAttribute("DisplayName", strDisplayName); // Any unique Display Name
           element.SetAttribute("Required", Required.ToString().ToUpper());
           return element.OuterXml; // Returning the OuterXML to create the field as XML
       }

//Code to custom field as XML from custom field type
String strFieldasXML = GetCreateFieldAsXml(Guid.NewGuid(), “Hit Count Field”, false, "SampleHitCountField", “SampleHitCountField”);
web.Fields.AddFieldAsXml(strFieldasXML); //here 'web' is a SPWeb object

1 comment: