Fire my passion

Anything with my most passion……
WSSv3 自定义字段类型--TreeView

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

posted on 2007-10-12 14:31  everx  阅读(407)  评论(0编辑  收藏  举报