在网上找了好多资料,但是没有关于TreeView的自定义字段类型的,所以就自己写了一个,效果还是不错的。分享一下^_^

一、在VS2005中新建一个空的SharePoint项目,起好项目名称
二、在项目中添加新项,选择“Field Control”,填好项目的名称(例如:MyField),确定
三、此时,在项目中会多出几个文件夹和类文件。其中有一个MyField的文件夹(注:此名称和第2步的名称匹配),该文件夹下有两个cs文件:MyField.Field.cs, MyField.FieldControl.cs
        这两个文件各有作用。
        1、MyField.Field.cs是这个自定义字段类型的主类,需要继承于SPField或者其子类。
            因为我的这个TreeView是要进行多选的,所以继承SPFieldMultiChoice
            默认已经给出了一些方法。两个构造函数,不需要改变。我们需要做的是重写GetFieldValue方法和GetValidatedString方法,第一个是用户返回自定义字段类型的值,第二个是为了验证输入是否正确

    

public override object GetFieldValue(string value)

        {

            return new SPFieldMultiChoiceValue(value);

        }


        public override string GetValidatedString(object value)

        {

            if (base.Required && value.ToString().Equals(string.Empty))

            {

                throw new SPFieldValidationException("not allowed!");

            }

            return value.ToString();

        }

        2、MyField.FieldControl.cs是控制自定义字段类型显示的类,需要载入一个控件模版。该模版可以选择默认的,也可以自己定制,因为要写一个TreeView,所以当然自定义一个。
            首先,该类应该继承BaseFieldControl类,需要重写DefaultTemplateName属性、Value属性、CreateChildControls方法。第一个属性作用是找到控件的模版,即一个ASCX控件,放于12\TEMPLATE\CONTROLTEMPLATES目录下。第二个属性是为了读写自定义字段类型的值,最后一个方法是创建该控件的必要方法

    

protected override string DefaultTemplateName

        {

            get

            {

                return @"MyTreeView";

            }

        }

        public override object Value

        {

            get

            {

                EnsureChildControls();

                SPFieldMultiChoiceValue fieldMultiChoiceValue = new SPFieldMultiChoiceValue();

                GetTreeViewCheckedValue(TreeView.Nodes[0], ref fieldMultiChoiceValue);

                return fieldMultiChoiceValue;

            }

            set

            {

                this.EnsureChildControls();

                this.SetFieldControlValue(value);

            }

        }

        protected override void CreateChildControls()

        {

            if (this.Field == null || this.ControlMode == SPControlMode.Display)

                return;

            base.CreateChildControls();

            TreeView tv = (TreeView)TemplateContainer.FindControl("treeView");

            BuildTree(tv, GetData());

        }

四、创建用于显示的自定义控件(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="MyTreeView" runat="server">

    <Template>
      <asp:TreeView ID="treeView" runat="server" Font-Size="10pt">

      </asp:TreeView>

    </Template>
</SharePoint:RenderingTemplate>

五、在工程中还有一个xml文件,文件名以“fldtypes_”开头,用户描述这个自定义字段类型,包括显示的名称,程序集的信息,显示时的样式等

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

  <FieldType>

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

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

    <Field Name="TypeDisplayName">MyField</Field>

    <Field Name="TypeShortDescription">MyField</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">MyCustomFieldTypes.MyField, MyCustomFieldTypes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5</Field>

  </FieldType>
</FieldTypes>

六、大功就要告成啦,将那个Ascx控件和上面的Xml放到SharePoint的指定文件夹下,再将生成的Dll程序集注册到GAC,重起IIS,ok!现在可以在SharePoint中开到我们的类型了。点击创建栏即可看到MyField类型。