MOSS2007的自定义字段类型

MOSS2007的自定义字段类型是一个非常有用的功能,但在网上相关的实例介绍很少,所以下面就
一步一步地介绍怎样来创建一个自定义字段类型,我们的目标是:实现一个具有可配置性的下拉列表框,
其选择项目是读取XML文件获得。

实现一个自定义字段类型主要需要完成三种文件的编制:1)定义类型的XML文件;2)定义展现模板
*.ascx文件;3)定义后台代码程序集。

这里因为我们想要实现一个可读取XML文件的下拉列表框,所以我们首先还要定义一个配置文件
SelectItemFromXMLConfig.xml。
XML代码如下:

<? xml version="1.0" encoding="utf-8" ?>

< SelectItems >

   < Item > 选项一 </ Item >

   < Item > 选项二 </ Item >

   < Item > 选项三 </ Item >

   < Item > 选项四 </ Item >

   < Item > 选项五 </ Item >

</ SelectItems >

然后,我们可以打开Visual Studio2005,然后添加一个类库,如果你已经安装了扩展模板也可以直接选择
创建“Field Control”类型的项目。建议下载微软的SharePoint工具包:Windows SharePoint Services 3.0 Tools: Visual Studio 2005 Extensions.

这里我们新建一个名叫SelectItemFromXMLField的类库,其中包含两个类文件:SelectItemFromXML.Field.cs
和SelectItemFromXML.FieldControl.cs。

SelectItemFromXML.Field.cs完整代码如下:

using  System;

using  System.Runtime.InteropServices;

using  System.Security.Permissions;

 

using  Microsoft.SharePoint;

using  Microsoft.SharePoint.WebControls;

using  Microsoft.SharePoint.Security;

 

namespace  SelectItemFromXML

{

    [CLSCompliant( false )]

    [Guid( " 92f76873-537c-4c13-abaf-2d47bdc7e2be " )]

     public   class  SelectItemFromXMLField : SPFieldChoice

    

{

         public  SelectItemFromXMLField(SPFieldCollection fields,  string  fieldName)

            :  base (fields, fieldName)

        

{

        }

        

         public  SelectItemFromXMLField(SPFieldCollection fields,  string  typeName,  string  displayName)

            :  base (fields, typeName, displayName)

        

{

        }

 

         public   override  BaseFieldControl FieldRenderingControl

        

{

            [SharePointPermission(SecurityAction.LinkDemand, ObjectModel  =   true )]

             get

            

{

                BaseFieldControl fieldControl  =   new  SelectItemFromXMLFieldControl();

                fieldControl.FieldName  =   this .InternalName;

 

                 return  fieldControl;

            }

        }

    }

}

SelectItemFromXML.FieldControl.cs完整代码如下:
 

using  System;

using  System.Runtime.InteropServices;

using  System.Web;

using  Microsoft.SharePoint;

using  Microsoft.SharePoint.WebControls;

using  System.Web.UI.WebControls;

using  System.IO;

using  System.Xml;

using  System.Diagnostics;

 

namespace  SelectItemFromXML

{

    [CLSCompliant( false )]

    [Guid( " eb269bd9-0d3e-4aa2-b88f-37fbccb0d7d8 " )]

     public   class  SelectItemFromXMLFieldControl : BaseFieldControl

    

{

         protected  DropDownList cboList;

         protected   override   string  DefaultTemplateName

        

{

             get

            

{

                 return   " SelectItemFromXMLFieldControl " ;

            }

        }

 

         public   override   object  Value

        

{

             get

            

{

                EnsureChildControls();

                 return  cboList.SelectedValue.ToString();

            }

             set

            

{

                EnsureChildControls();

                cboList.SelectedValue  =  ( string ) this .ItemFieldValue;

            }

        }

 

         public   override   void  Focus()

        

{

            EnsureChildControls();

            cboList.Focus();

        }

 

         protected   override   void  CreateChildControls()

        

{

             if  (Field  ==   null return ;

             base .CreateChildControls();

 

             if  (ControlMode  ==  Microsoft.SharePoint.WebControls.SPControlMode.Display)

                 return ;

 

            cboList  =  (DropDownList)TemplateContainer.FindControl( " cboList " );

 

             if  (cboList  ==   null )

            

{

                 throw   new  ArgumentException( " cboList is null. Corrupted SelectItemFromXMLFieldControl.ascx file. " );

            }

 

             if  ( ! Page.IsPostBack)

            

{

                    

                     string  configFile  =  Environment.CurrentDirectory  +   " //SelectItemFromXMLConfig.xml " ;

                     if  ( ! File.Exists(configFile))

                    

{

                        cboList.Items.Add( new  ListItem( " Config file not found! " , " Error " ));

                        cboList.ToolTip  =  configFile  +   "  not found! " ;

                    }

                     else

                    

{

 

                        XmlDocument xmlDoc  =   new  XmlDocument();

                        xmlDoc.Load(configFile);

 

                        XmlNodeList nodelist  =  xmlDoc.DocumentElement.ChildNodes;

                         foreach  (XmlNode node  in  nodelist)

                        

{

                            cboList.Items.Add( new  ListItem(node.InnerText, node.InnerText));

                        }

                    }

         

            }

            

        }

 

    }

}

如果你使用模板创建项目,则上面的代码大部分会被自动生成。

值得注意的几个地方是:
 1)SelectItemFromXMLField类将继承SPFieldChoice基类,并重写FieldRenderingControl方法。
 2)SelectItemFromXMLFieldControl 类将继承BaseFieldControl基类。
 3)CreateChildControls方法中读取XML配置文件,并把选项绑定到下拉列表框(DropDownList)子控件上。
 4)上面代码中使用了Environment.CurrentDirectory语句,后面部署时要把配置文件放到

代码编写完成之后,要对程序集进行强名称设置,并编译。

接下来,我们来制作展现模板。你可以在当前解决方案中添加一个文本文件“SelectItemFromXMLFieldControl.ascx”。
然后打该文件编写代码如下:
 

<%

@ Control Language = " C# "  Debug = " true " %>

<%

@ Assembly Name = " Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c "   %>

<%

@ Register TagPrefix = " SharePoint "  Assembly = " Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c "  Namespace = " Microsoft.SharePoint.WebControls "    %>

 

< SharePoint:RenderingTemplate  ID ="SelectItemFromXMLFieldControl"  runat ="server" >

     < Template >

         < asp:DropDownList  runat ="server"  ID ="cboList" />

     </ Template >

</ SharePoint:RenderingTemplate >

值得注意的地方是:上面代码中DropDownList的ID是"cboList",这个名字曾经被后台类SelectItemFromXMLFieldControl使用
TemplateContainer.FindControl方法寻找过,所以不要写错。

OK,最后,我们可以在当前解决方案中添加一个XML文件“FLDTYPES_SelectItemFromXmlField.xml”。
代码如下:
 

<? xml version="1.0" encoding="utf-8" ?>

< FieldTypes >

   < FieldType >

     < Field  Name ="TypeName" > SelectItemFromXML </ Field >

     < Field  Name ="ParentType" > Choice </ Field >

     < Field  Name ="TypeDisplayName" > Select Item From XML </ Field >

     < Field  Name ="TypeShortDescription" > Select Item From XML </ Field >

     < Field  Name ="UserCreatable" > TRUE </ Field >

     < Field  Name ="ShowInListCreate" > TRUE </ Field >

     < Field  Name ="ShowInSurveyCreate" > TRUE </ Field >

     < Field  Name ="ShowInDocumentLibraryCreate" > TRUE </ Field >

     < Field  Name ="ShowInColumnTemplateCreate" > TRUE </ Field >

     < Field  Name ="FieldTypeClass" > SelectItemFromXML.SelectItemFromXMLField,SelectItemFromXMLField, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ad167643f06d0c9c </ Field >

   </ FieldType >

</ FieldTypes >

值得注意的地方是:
  1)该定义文件的文件名一定要以“FLDTYPES”开头。
  2)FieldTypeClass项中的值是类的全名称和程序集的全名称,可以使用Reflector获得。


到这里,我们需要编写的所有文件都已经编写完成了,只要做简单的部署就可以了。

步骤如下:

  1)把强名称编译好的SelectItemFromXMLField程序集加入到GAC。
  2)把类型定义文件FLDTYPES_SelectItemFromXmlField.xml拷贝到c:/program.../12/TEMPLATE/XML目录下。
  3)把模板文件SelectItemFromXMLFieldControl.ascx拷贝到c:/program.../12/TEMPLATE/CONTROLTEMPLATES目录下。
    4)重启动IIS。(可以使用命令行iisreset)
  5)把该控件的配置文件SelectItemFromXMLConfig.xml拷贝到C:/Windows/System32/inetsrv目录下。
  
 
值得注意的地方是:
  前四步是部署自定义字段类型的一般步骤。第五步是针对这个实例的特殊步骤。你其实可以把配置文件放在你想放的任何位置,只要在前面编写SelectItemFromXMLFieldControl类的CreateChildControls方法时指定你想放的位置即可。

OK,到此自定义字段类型的过程已经结束。你可以在创建MOSS的某个列表栏时,发现一个新的类型“Select Item From XML”。选择该类型创建一个新栏后,当往该列表中添加项目时,会发现添加页面中对应新栏的输入方式是一个下拉列表框,其中的选项就是我们在XML配置文件中定义的选项了! 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jiangxng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值