Creating a read-only field with default value in a SharePoint list
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("https://<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);
}
}
}
}
}
Comments
Anonymous
October 13, 2008
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)Anonymous
October 15, 2008
- 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.
Anonymous
November 20, 2008
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.htmlAnonymous
January 15, 2009
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! -TomAnonymous
January 15, 2009
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, SowmyanAnonymous
February 26, 2009
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, KevinHouAnonymous
February 26, 2009
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.aspxAnonymous
April 06, 2009
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.Anonymous
July 12, 2009
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/ FreyAnonymous
July 12, 2009
Hi KevinHou U can regeist some javascript code on the editForm.aspx FreyAnonymous
May 21, 2011
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))Anonymous
March 11, 2014
With Meta data field option we can do the same.Anonymous
October 25, 2015
how to make this readonly field for dropdown list and checkboxes using javascript /jQuery in my editform by using content editor web part. help is appreciated!