zoukankan      html  css  js  c++  java
  • SharePoint: Creating a custom field

    In SharePoint, a site column is a reusable column definition, or template, that you can assign to multiple lists across multiple SharePoint sites. Site columns are associated to a particular Data Type. This Data Type is called a Field. For example, when you create a site column, you are also prompted to select the type of information, which is nothing but a Data Type or a Field.

    creating-site-column

    Sometimes, it is necessary for us to create our own custom field that does not conform to the field types included in SharePoint by default. Something like this:

    custom-field-site-column

    How do we do that?

    All you have to do is – create a custom field which would result in creating a Field Class, Field Control and Field Type Definitions

    image

    The Field Class should inherit from any of the SPField classes shown above in the diagram.

    The Field Control should have Field Rendering Control and a Field Rendering Template.

    The Field Type Definitions is a XML file which contains some information about the custom field.

    Custom Field Class - CustomField

    Below is a custom field class which inherits SPFieldChoice

    public class CustomField : SPFieldChoice
    {
        public CustomField(SPFieldCollection fields, string fieldName) :

                                                                        base(fields, fieldName) { }

        public CustomField(SPFieldCollection fields, string typeName, string displayName) :

                                                                        base(fields, typeName, displayName) { }

        public override BaseFieldControl FieldRenderingControl

        {
            get
            {
                BaseFieldControl fieldControl = new CustomFieldControl();
                fieldControl.FieldName = InternalName; return fieldControl;
            }
        }
    }

    As you can see in the above code, it does nothing but creates a custom field control to render our custom field.

    Field Rendering Template – CustomFieldControl.ascx

    <SharePoint:RenderingTemplate Id="CustomFieldTemplate" runat="server" > 
    
        <Template> 
    
     <asp:CheckBox ID="YesNoCheckBox" runat="server" Text="Yes/No" /> 
    
        </Template>
    
    </SharePoint:RenderingTemplate> 
    

    This is going to render a simple ASP.NET CheckBox

     Field Rendering Control – CustomFieldControl.cs

    The name of the field rendering control should be same as the name of the field rendering template(ascx) name and must inherit from BaseFieldControl.

    public class CustomFieldControl : BaseFieldControl { #region Member Variables protected CheckBox YesNoCheckBox; private string _value; #endregion #region Overridden Methods #endregion #region Private Methods #endregion } 
    

    The basic template(with our example’s member variables) code block is shown above. The member variables are nothing but the controls that we created in the field rendering template.

    The field control class can be considered as the code behind for the field rendering template.

    To make our custom field work, we first need to render the template and display our checkbox.

    #region Overridden Methods protected override void CreateChildControls() { if (Field == null && this.ControlMode == SPControlMode.Display) { return; } base.CreateChildControls(); FindDisplayControle(); } #endregion #region Private Methods private void FindDisplayControle() { YesNoCheckBox = (CheckBox)TemplateContainer. FindControl(DefaultValues.YesNoCheckBoxName); if (DisplayLiteral == null || YesNoCheckBox == null) throw new ConfigurationErrorsException("Error: Cannot load the controls!"); } #endregion 
    

    The code block finds the checkbox from our template container (field rendering template).

    So, how is the value persisted?

    We do that ‘magic’ by overriding the Value property

    #region Overridden Methods public override object Value { get { EnsureChildControls(); SetValue(); return _value; } set { EnsureChildControls(); _value = value.ToString(); LoadCheckBox(); } } #endregion #region Private Methods private void LoadCheckBox() { if(!string.IsNullOrEmpty(_value)) { YesNoCheckBox.Checked = _value=="Yes"; } } private void SetValue() { _value = YesNoCheckBox.Checked ? "Yes" : "No"; } #endregion 
    

    Looks very simple, isn’t it :)

    One last thing to do is to tell SharePoint our default template name and display template name, which is nothing but the name of our field rendering template

    #region Overridden Methods protected override string DefaultTemplateName { get { return DefaultValues.RenderingTemplateName; } } public override string DisplayTemplateName { get { return DefaultValues.RenderingTemplateName; } } #endregion 
    

    Field Type Definitions – fldtypes_<custom-field>.xml

    We now need to create a field type definition. The field type definition file is an XML file whose name is prefixed by fldtypes_ followed by a name. It is important that we follow this convention. Our field type definition for our custom field is called as fldtypes_customfield.xml

    <fieldtypes> <FieldType> <Field Name="TypeName">CustomField</Field> <Field Name="TypeDisplayName">Custom Field</Field> <Field Name="TypeShortDescription">Custom field</Field> <Field Name="ParentType">Note</Field> <Field Name="FieldTypeClass">Chaks.Samples.SharePoint.CustomField, Chaks.Samples, Version=1.0.0.0, Culture=neutral, PublicKeyToken=**************** </Field> <Field Name="UserCreatable">TRUE</Field> </FieldType> </fieldtypes> 
    
    You can read more about custom field type definitions here
    

    Deploying

    1) Place the .dll into the GAC

    2) Copy the fldtypes_customfield.xml into 12hive->TEMPLATE->XML

    2) Copy the CustomFieldControl.ascx into 12hive->TEMPLATE->CONTROLTEMPLATES

    ( It is always recommended to use STSDEV or WspBuilder for SharePoint projects. That makes your deployment (and development) very easy )

    You can download the files below:

  • 相关阅读:
    【卷影副本】文件属性“以前的版本”中无法看到历史文件的解决方案
    合理的网间结算和互联网转接服务,电信敢正视吗?
    FTP无法连接可能是安全狗设置的原因
    播放器播放视频画面均变暗(但网页视频正常)的解决方案
    安装国际版firefox(火狐浏览器)并设置语言为中文
    navicat for mysql注册码:NAVN-LNXG-XHHX-5NOO
    "COM Surrogate 已停止工作"解决方案(windows7 64位及32位)
    IIS7 http自动跳转到https(通过编辑Web.config实现)
    sql 时间处理
    制作时间戳和时间戳转标准日期时间等
  • 原文地址:https://www.cnblogs.com/Areas/p/2264958.html
Copyright © 2011-2022 走看看