Nishand's Blog

Welcome to my personal blog, All the information in this bogs is my ideas,findings and thoughts on .Net, Asp.Net and SharePoint.
ALL POSTING ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND

Setting the property 'AllowMultipleValues' resets the control's type to "Lookup" when it is inherited from SPFieldLookup class.

When you develop a custom field type that inherits from SPFieldLookUp/SPFieldUser(not sure about any other controls) .
The derived field type has its own rendering controls. The issue arises when multiple values are to be stored in a field of the custom fieldtype.
In order to save multiple values to an SPFieldLookUp the property "AllowMultipleValues" should be set to true . When "AllowMultipleValues" property is
set to true, the field rendering control is overridden by MultipleLookupField. So the custom field rendering control is never instantiated/render if the field is
set to store multiple values(AllowMultipleValues=true). As a workaround what I did is overridden the ‘OnAdded’ function and edit the schema to append the ‘Mult’ attribute.

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Text;
   4: using Microsoft.SharePoint;
   5: using Microsoft.SharePoint.WebControls;
   6: using System.Web.UI;
   7: using System.Xml;
   8:  
   9: namespace CustLookuColumn
  10: { 
  11:     public class MultiLookUp : SPFieldLookup  
  12:     {        
  13:        
  14:        public MultiLookUp(SPFieldCollection fields, string fieldName)
  15:             : base(fields, fieldName)
  16:         {          
  17:                    
  18:         }
  19:  
  20:        public override void OnAdded(SPAddFieldOptions op)
  21:        {
  22:            base.OnAdded(op);        
  23:            XmlDocument doc = new XmlDocument();
  24:            doc.LoadXml(this.SchemaXml);
  25:            XmlNode element = doc.FirstChild;
  26:            XmlAttribute attr = doc.CreateAttribute("Mult");
  27:            attr.Value = "TRUE";
  28:            element.Attributes.Append(attr);
  29:            this.SchemaXml = doc.OuterXml;
  30:            base.Update();
  31:  
  32:        }
  33:        public MultiLookUp(SPFieldCollection fields, string typeName, string displayName)
  34:             : base(fields, typeName, displayName)
  35:         {
  36:            
  37:         }        
  38:        
  39:         public override BaseFieldControl FieldRenderingControl
  40:         {
  41:             get
  42:             {
  43:                 BaseFieldControl fieldControl = null;
  44:                 fieldControl = new RenderFieldControl(); //See the below code snippet                               
  45:                 fieldControl.FieldName = InternalName;
  46:                 return fieldControl;
  47:             }
  48:         }
  49:     }   
  50: }

 

   1: using System;
   2: using System.Runtime.InteropServices;
   3: using Microsoft.SharePoint;
   4: using Microsoft.SharePoint.WebControls;
   5: using System.Web.UI;
   6: using System.Web.UI.WebControls;
   7: using System.Web.UI.HtmlControls;
   8:  
   9: //This is just a skeleton, I haven't included the entire functionality. 
  10:  
  11: namespace CustLookuColumn
  12: {
  13: public class RenderFieldControl : BaseFieldControl
  14:    {      
  15:        protected override void CreateChildControls()
  16:        {
  17:            base.CreateChildControls();
  18:         }
  19:  
  20:     }
  21:  
  22: }

 

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <FieldTypes>
   3:   <FieldType>
   4:     <Field Name="TypeName">MultiLookUp</Field>
   5:     <Field Name="TypeDisplayName">MultiLookUpField</Field>
   6:     <Field Name="TypeShortDescription">Custom Multi LookUp Field</Field>
   7:     <Field Name="ParentType">LookupMulti</Field>
   8:     <Field Name="UserCreatable">TRUE</Field>
   9:     <Field Name="FieldTypeClass">CustLookuColumn.MultiLookUp,CustLookuColumn , Version=1.1.1.1, Culture=neutral, PublicKeyToken=6332f1922196b6de</Field>
  10:     <Field Name="FieldEditorUserControl">/_controltemplates/YOUR_LookupFieldEditor.ascx</Field>
  11:     <!-- 
  12:         YOUR_LookupFieldEditor.ascx is not included it would be identical to the ascx control under ..\12\TEMPLATE\CONTROLTEMPLATES\LookupFieldEditor.ascx
  13:     -->
  14:   </FieldType>
  15: </FieldTypes>

 

Note: The samples provided within this blog may not work, my intention was to provide you a workaround when you hit with this issue.

Happy customization!!!

Published Monday, September 21, 2009 2:07 PM by nishandv

Comments

No Comments
Anonymous comments are disabled

© 2009 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Microsoft
Page view tracker