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
 
No comments:
Post a Comment