Creating a read-only field with default value in a SharePoint list

Creating a read-only field with default value in a SharePoint list

  • Comments 11
 

Whenever we create a column with type “Single line of text” in SharePoint lists we will get an option for providing default value. If we provide the default value and once if we add any item to that list with that field , then we can see the default value in a text box in the edit or new form and even we can edit it at that time. So, if we want to create a read-only column with default value and we can’t edit it, then you can implement it by using the FieldAdded event.

 

FieldAdded event is list specific synchronous event and it will get from SPListEventReciver class. Once you attached the event to a list then whenever you add a new column to the list, this event will fire and we can customize it in this hook point. Below I am giving the detailed steps on how we can accomplish this requirment.

 

1.       Create a class library add SharePoint dlls and the a class with the following code.

 

using System;

using System.Collections.Generic;

using System.Text;

using System.Web;

using Microsoft.SharePoint;

using Microsoft.SharePoint.Utilities;

 

namespace TestEvent

{

    class ReadonlyFieldTest : SPListEventReceiver

    {

        public override void FieldAdded(SPListEventProperties properties)

        {

            SPField oField = properties.Field;

            if (oField.Title == "MyTestColumn")// you can think about a better check point here.

            {

                oField.DefaultValue = "MyDefaultValue";

                oField.ReadOnlyField = true;

                oField.Update();

            }

        }

    }

 

}

2.       Deploy the dll in GAC after compiling the class library with a strong name

3.      You can register the event handler using a feature or using SharePoint APIs. If you want to register the event handler to a particular site collection or farm level, then you can go with a custom feature.  Since I am testing it with only one List, here I have registered FieldAdded event using SharePoint APIs. I have created a .Net console application to do that.

 

using System;

using System.Collections.Generic;

using System.Text;

using Microsoft.SharePoint;

 

namespace EventRegistrationTool

{

   class Program

   {

        static void Main(string[] args)

        {

            using (SPSite oSite = new SPSite("http://<sitename>"))

            {

                using (SPWeb oWeb = oSite.OpenWeb())

                {

                    SPList oList = oWeb.Lists["Shared Documents"];

 

                    string strAssembly = "TestEvent, Version=1.0.0.0, Culture=neutral, PublicKeyToken=fac0274b1d81d1fd";

                    string strClass = "TestEvent.ReadonlyFieldTest";

 

                    oList.EventReceivers.Add(SPEventReceiverType.FieldAdded,strAssembly,strClass);

                    oList.EventReceivers.Add(SPEventReceiverType.FieldAdding,strAssembly, strClass);

                }

            }

 

        }

    }

}

Leave a Comment
  • Please add 2 and 5 and type the answer here:
  • Post
  • 1>How to edit the readonly  field.

    2>What is the difference betwen readonly n hidden fields (since both are not seen in the editform.aspx)

  • 1. You should explicitly change the readonly

      property to false.

    2.http://msdn.microsoft.com/en-     us/library/microsoft.sharepoint.spfield_properties.aspx

     Readonly :

      ReadOnlyField property Gets or sets a

      Boolean value that specifies whether values

      in the field can be modified.  

     Hidden :

      Hidden  Gets or sets a Boolean value  

      that specifies whether the field is

      displayed in the list.  

  • why put this in event handler?

    Just build a console exe application program to run it once!

    see my blog

    http://hi.baidu.com/freying/blog/item/f036e5002fc75f011c9583e3.html

  • Thanks! I've just been thinking about something like this, how to get an event receiver registered. Do you think using a console app to do this one time is a good way to deploy something? I guess a feature is the best way, but it seems like a lot of work. Do you use these "do-the-dirty-work" console apps in production environments? I worry about how to document that I've done that if my site/server ever goes down and I need to recreate things. Thanks again! -Tom

  • Hi Tom,

    Yes,your thoughts are correct.

    The best way would be using a feature. Thus it will be available in your server and whenever you need it, then you can activate it. A one time executiion of console application is not a good method, instead go with feature.

    Thanks,

    Sowmyan

  • To follow up on a previous question: How do I make my field readonly AND have it be displayed on the editForm.aspx?  Sounds silly I know, but we are auto-populating some field values based on the user's uploaded file contents (XML) using ItemAdded.  I want them to see their field values on the edtiForm when they upload, as a sanity check of their XML contents.

    Thanks,

    KevinHou

  • I hope that you can accomplish it by creating a custom field to render the control as a Label. Please refer the following post for getting some sample code.

    Refer this post and create a custom field which will render a label control.

    http://blogs.msdn.com/sowmyancs/archive/2008/11/14/work-around-to-render-the-custom-field-in-list-view.aspx

  • Here I got a tool called SharePoint column view permission from http://www.sharepointboost.com/columnpermission.html. I do not know which one is better since I have not used neither of them.

  • HI Tom

    I come again.

    If u dont like console app, I can give u another option.

    Download the SPM from codeplex, modify the  field  properties. Remeber modify it from List -> field

    (do not from contenttype)

    http://spm.codeplex.com/

    Frey

  • Hi KevinHou

    U can regeist some javascript code  on the editForm.aspx

    Frey

  • djavascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$content$ctl00$w_31575$_a3f425$ctl00$ctl00$ctl00$ctl05$bpCommentForm$ctl05$btnSubmit", "", true, "BlogPostCommentForm-ctl00_content_ctl00_w_31575__a3f425_ctl00_ctl00", "", false, true))

Page 1 of 1 (11 items)