Skip to main content

How to create a custom field type in SharePoint 2010 using visual studio 2010?



There are default field types like Text, Note, Boolean, Integer, Number, Decimal, DateTime, Choice, Lookup etc. We can also make our custom field types by using visual studio 2010.
Why Necessary?

For initialization and format field values.
Also used for data validation on user inputs.
Some points to remember:

Field types cannot be deployed in sandbox solution.
Might cause problem with Microsoft office products.
Might cause problem while viewing list items through data grid ir whenever trying to program against list using LINQ.

The structure should look like the below figure:



Steps to create custom field types:
1.     First create a new SharePoint project using the Empty SharePoint project template.

2.   Inside the project you need to add a public class for each custom field type.
3.     You need to add a special xml file namely fldtypes_{project name}.xml, to deploy the field type.
For each custom field type, you must create a field type class that inherits from one of the built-in field type classes, such as SPFieldText, SPFieldNumber, SPFieldDateTime, and SPFieldMultiColumn.
Then you required to add two public constructor. Here you don’t need to add any code within that constructor, only need to define the parameter list and pass these parameters on to the base class constructor with a matching parameter list. The code is below.
public class EmployeeStartDate : SPFieldDateTime
    {

        public EmployeeStartDate(SPFieldCollection fields, string fieldName)
            : base(fields, fieldName) { }

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


        // configure field to display date but not time
        public override void OnAdded(SPAddFieldOptions op)
        {
            this.DisplayFormat = SPDateTimeFieldFormatType.DateOnly;
            this.Update();
        }
}
The next step is to override whatever base class methods and properties make sense for your particular scenario. Here is the code sample that I have done here:
// add logic to create default date as first Monday
        public override string DefaultValue
        {
            get
            {
                DateTime startDate = DateTime.Today;
                while (startDate.DayOfWeek != DayOfWeek.Monday)
                {
                    startDate = startDate.AddDays(1);
                }
                return SPUtility.CreateISO8601DateTimeFromSystemDateTime(startDate);
            }
        }

        // add validation to ensure start date is a Monday
        public override string GetValidatedString(object value)
        {
            DateTime input = System.Convert.ToDateTime(value);
            if (input.DayOfWeek != DayOfWeek.Monday)
            {
                throw new SPFieldValidationException("Employee start date must be a monday");
            }
            return base.GetValidatedString(value);
        }

Here we have completed the creation of the custom field type and now we need to deploy.
Deployment:

For this we need to create a XML file. The naming convention is very much important, it must start with fldtypes then _  and then the project name.xml. For example fldtypes_FieldTypeDemo.xml.
Within that XML file each field type is created using a FieldType element, which must reside inside top-level FieldTypes element. The Field elements are required to provide information about the custom field type, its parent type, its display name, the field class name, the name of the assembly etc. Below is the code sample.



  
    EmployeeStartDate
    DateTime
    Employee Start Date
    Employee Start Date (demo)
    TRUE
    
      FieldTypeDemo.EmployeeStartDate,FieldTypeDemo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2a494da19a21cf85
    
  



TypeName and FieldTypeClass name are very much important.
Now deploy the solution and enjoy.

Popular posts from this blog

Cascading drop down column in a SharePoint List

This article will show how to use codeplex project to achieve Cascading drop down columns in SharePoint list. This article will show how to achieve parent child relationship in column of SharePoint list.   Objective This article will show how to use codeplex project to achieve Cascading drop down columns in SharePoint list. This article will show how to achieve parent child relationship in column of SharePoint list. Step 1 Download the project from codeplex . Choose WSP file to download. To download the project Click here Step 2 After downloading the WSP add the solution using STSADM command. Navigate to BIN folder and add the solution. Command C:\Program Files\Common Files\microsoft shared\Web Server Extensions\12\BIN> stsa dm -o addsolution -filename c:\Stoneshare.CascadingDropDown.WithFilter.wsp Step 3 Open Central ADMIN and deploy solution. Navigate to Operation -> Global Configuration -> Solution Management. Select the Global Deployment option. St...

How to deal with SharePoint 2010 exception "An exception occurred when trying to issue security token: The server was unable to process the request due to an internal error"

Scenario: You receive the below exception when you try to logon to a site that has been configured to use Claims Based Authentication with a custom membership provider using FBA credentials: Event ID from Event Log  - 8306 An exception occurred when trying to issue security token: The server was unable to process the request due to an internal error.  For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the <serviceDebug> configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework 3.0 SDK documentation and inspect the server trace logs.. Explanation: This error started to appear in our QA environment which does not have Visual Studio installed. I have tried starting the service "Claims to Windows Token Service" but that did not help either. I have made sure that all config...

Create Rating Visual Web Part Using Visual Studio 2010,

Create Rating Visual Web Part Using Visual Studio 2010,  also Apply Rating Settings using c#   Back End Design  Register Assembly    <%@ Register Tagprefix="SharePointPortalControls" Namespace="Microsoft.SharePoint.Portal.WebControls" Assembly="Microsoft.SharePoint.Portal, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> Add Control. <div>    Average Ratting :    <SharePointPortalControls:AverageRatingFieldControl ID="PageRatingControl" runat="server"/> </div>