在网上找了好多资料,但是没有关于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类型。