开发MOSS自定义字段类型

前段时间,由于刚好项目定制的需要,笔者就开发了几个自定义字段类型。在这抽空做个详细笔记,方便初学者学习。这方面的资料也很多,如果自身觉得不大明白可以参考下SDK和网上的相关文章。本章的目的主要是给新手起个抛砖引玉的作用。至于字段类型要实现什么功能,还是以自己的实际开发需求来做引导。接下来就介绍该如何实现。。。。
其实实现一个字段类型的开发很简单,无非就是由3部分组成:1继承于SPField的字段类,2继承于BaseRenderControl的字段呈现空间类,3编写一个配置文件,配置文件必须以fldtypes_开头。(如果是采用模版,那就再编写一个.ascx模版页)。
1.BaseRenderControl的常用属性和方法有【
    Value:此属性自动被系统调用,可以利用此属性跟字段进行交互。
    Field:利用此属性获取跟控件相关联的字段类。
    FieldName:获取或设置字段名。ControlMode:获取空间当前所出的模式。
    List:获取关联的列表。ItemFieldValue:获取对应列表项的值】。
2.SPField的常用属性和方法有【
    ShowInDisplayForm:此属性控制字段是否显示在呈现页面
   ShowInEditForm:此属性控制字段是否显示在编辑页面
   ShowInNewForm:此属性控制字段是否显示在新建页面
   FieldValueType:字段类型值
   FieldRenderingControl:返回字段呈现空间实例
   GetValidatedString:此方法返回通过验证的值,若验证失败则抛出SPFieldValidationException
   GetFieldValue:获得字段的值
   GetFieldValueForEdit:用于显示在编辑的页面上
   OnAdded:字段被添加之后调用
   OnUpdated:字段被更新之后调用
   OnDeleting:字段被删除之后调用】
3.至于配置文件:大家可以直接参考SDK相关资料。。。。。。。。这里就不在详细简述了。
下面直接就把相关的代码文件附上:(该字段类型实现获取当前网站的所有调查列表的名称。至于中间用到的一些方法,大伙如果不明白,可以直接看代码中的注释。新建一个类库项目,两个类文件分别命GetallSurveyListTitleFielControl,GetallSurveyListTitleField,然后引用Microsoft.Sharepoint.dll,项目记得设置强名称。。。。。。。。。。。。。)
GetallSurveyListTitleFielControl.cs

复制代码
  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;
  7 using  System.Web.UI.WebControls;
  8 using  System.IO;
  9 namespace  GetallSurveyListTitle
 10 {
 11    class GetallSurveyListTitleFielControl:BaseFieldControl
 12    {
 13        private DropDownList drp_SurveyListTitle;
 14        private Label lb_SurveyListTitle;
 15        protected override void CreateChildControls()
 16        {
 17             base.CreateChildControls();
 18            //为显示模式下
 19            if (this.ControlMode == SPControlMode.Display)
 20             {
 21
 22                 this.TemplateName = this.DisplayTemplateName;
 23                 //此处的"txt_SurveyListTitle"和"Drp_SurveyListTitle"将在呆会创建的自定义字段模板中用到。
 24                 lb_SurveyListTitle = (Label)TemplateContainer.FindControl("lb_SurveyListTitle");
 25                 if (lb_SurveyListTitle == null)
 26                 {
 27                     throw new SPException("模板中必须存在ID为lb_SurveyListTitle的TextBox控件");
 28                 }

 29                 else
 30                 {  
 31                     lb_SurveyListTitle.Text=""+this.ItemFieldValue;
 32                     return;
 33                 }

 34             }

 35               //编辑或新增模式下
 36             else 
 37             {
 38                 drp_SurveyListTitle = (DropDownList)TemplateContainer.FindControl("Drp_SurveyListTitle");
 39                 if (drp_SurveyListTitle == null)
 40                 {
 41                     throw new SPException("模板中必须存在ID为Drp_SurveyListTitle的DropDownList控件");
 42
 43                 }

 44                
 45             }

 46
 47
 48             if (!Page.IsPostBack)
 49             {
 50                 SPWeb mysite = SPContext.Current.Web;
 51                 SPListCollection ListCollection = mysite.Lists;
 52                 foreach (SPList list in ListCollection)
 53                 {
 54                     if (list.BaseTemplate.ToString() == "Survey")
 55                     {
 56                         string surveytitle = list.Title;
 57                         //绑定到下拉框
 58                         this.drp_SurveyListTitle.Items.Add(new ListItem(surveytitle, surveytitle));
 59
 60                     }

 61
 62                 }

 63             }

 64            
 65            
 66          
 67        }

 68
 69        //在显示模式下使用的模板
 70        public override string DisplayTemplateName
 71        {
 72            get
 73            {   //TempalteID
 74                return "SurveyListTitleDisplay";
 75            }

 76
 77        }

 78
 79        //默认模式下使用的模板
 80
 81        protected override string DefaultTemplateName
 82        {
 83            get
 84            {
 85                return "SurveyListTitleFieldControl";
 86            }

 87        }

 88        //重写Value
 89        public override object Value
 90        {
 91            get
 92            {
 93                this.EnsureChildControls();
 94                if (this.drp_SurveyListTitle != null)
 95                {
 96
 97                    return drp_SurveyListTitle.SelectedValue.ToString();
 98                }

 99                else 
100                {
101                    return null;
102                }

103            }

104            set
105            {
106                this.EnsureChildControls();
107                if (this.drp_SurveyListTitle != null)
108                {
109
110                    this.drp_SurveyListTitle.SelectedValue =(string)this.ItemFieldValue;
111                }

112                
113            }

114        }

115        //重写控件焦点
116        public override void Focus()
117        {
118            this.EnsureChildControls();
119            this.drp_SurveyListTitle.Focus();
120
121        }

122    
123    
124    
125    }

126}

127
复制代码

 

GetallSurveyListTitleField.cs

复制代码
 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Text;
 4 using  Microsoft.SharePoint;
 5 using  Microsoft.SharePoint.WebControls;
 6 namespace  GetallSurveyListTitle
 7 {
 8    //直接继承SPFieldChoice,重写BaseFieldControl
 9    public class GetallSurveyListTitleField:SPFieldChoice
10    {
11
12        public GetallSurveyListTitleField(SPFieldCollection fields, string fieldname)
13            : base(fields, fieldname)
14        
15        
16        }

17
18        public GetallSurveyListTitleField(SPFieldCollection fields, string typename,string displayname)
19            : base(fields,typename,displayname)
20        {
21
22        }

23       //返回呈现控件(重写FielRenderingControl)
24        public override BaseFieldControl FieldRenderingControl
25        {
26           
27            get
28            {
29                BaseFieldControl ctl = new GetallSurveyListTitleFielControl();
30                ctl.FieldName = this.InternalName;
31                return ctl;
32            }

33        }

34    
35    }

36}

37
复制代码

fldtypes_GetallSurveyListTitle.xml

复制代码
 1 <? xml version = " 1.0 "  encoding = " utf-8 " ?>
 2 < FieldTypes >
 3    < FieldType >
 4      < Field Name = " TypeName " > GetallSurveyListTitle </ Field >
 5      < Field Name = " ParentType " > Choice </ Field >
 6      < Field Name = " TypeDisplayName " > 获取调查列表标题 </ Field >
 7      < Field Name = " TypeShortDescription " > 获取调查列表标题 </ Field >
 8      < Field Name = " UserCreatable " > TRUE </ Field >
 9      < Field Name = " ShowInListCreate " > TRUE </ Field >
10      < Field Name = " ShowInSurveyCreate " > TRUE </ Field >
11      < Field Name = " ShowInDocumentLibraryCreate " > TRUE </ Field >
12      < Field Name = " ShowInColumnTemplateCreate " > TRUE </ Field >
13      < Field Name = " FieldTypeClass " > GetallSurveyListTitle.GetallSurveyListTitleField,GetallSurveyListTitle,Version = 1.0 . 0.0 , Culture = neutral, PublicKeyToken = d983c60297f46343 </ Field >
14    </ FieldType >
15 </ FieldTypes >
16
17
复制代码

GetallSurveyListTitleFielControl.ascx

复制代码
 1 <% @ Control Language = " C# "    AutoEventWireup = " false "   %>
 2 <% @Assembly Name = " Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c "   %>
 3 <% @Register TagPrefix = " SharePoint "  Assembly = " Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c "   namespace = " Microsoft.SharePoint.WebControls " %>
 4 < SharePoint:RenderingTemplate ID = " SurveyListTitleFieldControl "  runat = " server " >
 5      < Template >
 6      < asp:DropDownList runat = " server "  ID = " Drp_SurveyListTitle "   />
 7      </ Template >
 8 </ SharePoint:RenderingTemplate >
 9 < SharePoint:RenderingTemplate ID = " SurveyListTitleDisplay "  runat = " server " >
10      < Template >
11      < asp:Label runat = " server "  ID = " lb_SurveyListTitle "   />
12      </ Template >
13 </ SharePoint:RenderingTemplate >
复制代码

到此一个字段类型开发完毕。
部署:1.把项目生成的.dll文件放入GAC。
         2.把配置文件放入12\Template\XML
         3.把字段模版文件放入12\Template\ControlTemplate
         4.IISRESET

你可能感兴趣的:(自定义)