前言: 笔记?说真的,真的是第一次写,不知道能不能写好,能不能让别人看明白写的什么。因为从幼儿园起就没有记过笔记,不是我懒,而是一种习惯。
闲言少叙,下面先看我学自定义字段的一个过程吧。一、自定义字段实现的功能:添加一个地区信息的自定义字段,让用户可以填写国家、省、城市的名称(如果读者有兴趣,可以改成下拉菜单式的).
1、创建项目首先打开VS2005,然后点击工具条上的文件->新建->项目,弹出新建项目面板,在面板左侧选择项目类型下的sharepoint(如果没安装sharepoint先安装下),然后再面板右侧选择Empty,然后给项目起个名称,如CustomStudy,再选个项目存放的位置,如下图: 点击确定,VS会为我们创建一个空的项目。如图: 2、下面我们要添加类文件 本来MS已经为我们创建好了创建自定义字段的类模板,可是我创建了好多次,都部署不成功,所以没办法,只能放弃他提供的类模板,自己创建空的类(其实用MS提供的模板应该是没问题的,可是我一直没找到方法,所以暂时放弃了)。 在新添加一个类之前,我们要先添加个引用,就是Microsoft.SharePoint.dll,这个文件在C:/Program Files/Common Files/Microsoft Shared/web server extensions/12/ISAPI下。具体步骤是:在解决方案资源管理器里,右键点击项目名称,然后在弹出的菜单里选择添加引用,如图: 切换到浏览标签,把查找范围定位到:C:/Program Files/Common Files/Microsoft Shared/web server extensions/12/ISAPI,如图: 选择Microsoft.SharePoint.dll,然后确定,这样引用就添加完成。右键点击项目名称,为项目添加我们的第一个类文件,如图,我们选择C#项目下的类: 给类起个名称,如CustomStudy,点击确定,VS为我们自动添加了相应的引用和代码,如图: 下面我们来修改我们刚添加的这个类的代码:首先添加: 注意这要和自己建的类名相同哦!using Microsoft.SharePoint; using Microsoft.SharePoint.WebControls; 再让该类继承 SPFieldMultiColumn 把下面代码添加到类内: #region 构造函数 public CustomStudy (SPFieldCollection fields, string fieldName) : base(fields, fieldName) { } public CustomStudy (SPFieldCollection fields, string typeName, string displayName) : base(fields, typeName, displayName) { } #endregion public override object GetFieldValue(string value) { if (string.IsNullOrEmpty(value)) return null; 注意:这两个要和你下面建的两个类的名称要相同 return new CustomStudyValue(value); } public override BaseFieldControl FieldRenderingControl { get { BaseFieldControl fldControl = new CustomStudyControl(); fldControl.FieldName = InternalName; return fldControl; } } 到这里,我们的第一个类文件就大功告成了。其实,如果用MS提供的模板,这些代码是自动生成的。这里就不提了,读者可以自己用MS的模板建个看下。用同样的方法,再为项目添加两个类文件:CustomStudyControl.cs和CustomeStudyValue.cs。在这之前,要添加System.Web的引用,不要告诉我你不知道怎么添加的哦…^o^。 CustomStudyControl.cs的完整代码: using System; using System.Collections.Generic; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using Microsoft.SharePoint; using Microsoft.SharePoint.WebControls; namespace CustomStudy { class CustomStudyControl : BaseFieldControl { private TextBox txtCountry; private TextBox txtProvince; private TextBox txtCity; protected override string DefaultTemplateName { 注意下这个,等会我们要用 get { return "testcustom"; } } public override void Focus() { //base.Focus(); EnsureChildControls(); txtCountry.Focus(); } public override object Value { get { //return base.Value; this.EnsureChildControls(); CustomStudyValuefieldValue = new CustomStudyValue (); fieldValue.Country = txtCountry.Text.ToString(); fieldValue.Province = txtProvince.Text.ToString(); fieldValue.City = txtCity.Text.ToString(); return fieldValue; } set { EnsureChildControls(); CustomStudyValuefieldValue = (CustomStudyValue)value; txtCountry.Text = fieldValue.Country; txtProvince.Text = fieldValue.Province; txtCity.Text = fieldValue.City; } } protected override void CreateChildControls() { if (Field == null) return; base.CreateChildControls(); if (ControlMode == Microsoft.SharePoint.WebControls.SPControlMode.Display) return; txtCountry = (TextBox)TemplateContainer.FindControl("txtCountry"); txtProvince = (TextBox)TemplateContainer.FindControl("txtProvince"); txtCity = (TextBox)TemplateContainer.FindControl("txtCity"); if (txtCountry == null) throw new ArgumentException("控件加载失败!"); if (txtProvince == null) throw new ArgumentException("控件加载失败!"); if (txtCity == null) throw new ArgumentException("控件加载失败!"); txtCountry.TabIndex = TabIndex; txtCountry.CssClass = CssClass; txtCountry.ToolTip = Field.Title + "国家"; txtProvince.TabIndex = TabIndex; txtProvince.CssClass = CssClass; txtProvince.ToolTip = Field.Title + "省"; txtCity.TabIndex = TabIndex; txtCity.CssClass = CssClass; txtCity.ToolTip = Field.Title + "城市"; } } } CustomeStudyValue.cs的完整代码: using System; using System.Collections.Generic; using System.Text; using Microsoft.SharePoint; namespace CustomStudy { class CustomStudyValue : SPFieldMultiColumnValue { private const int numberOfFields = 3; public CustomStudyValue() : base(numberOfFields) { } public CustomStudyValue(string value) : base(value) { } public string Country { get { return this[0]; } set { this[0] = value; } } public string Province { get { return this[1]; } set { this[1] = value; } } public string City { get { return this[2]; } set { this[2] = value; } } } } 看了这些很有诱惑力的代码,你是不是有了跃跃欲试的冲动?那就一起来吧,跟着我的步骤,让我们一起把这个自定义字段做出来。(强烈建议不要直接使用源代码,虽然说我会把源代码提供出来)上面好象漏掉了什么,对,还没有给项目添加强命名。这个很简单:右键点击项目,选择“属性”选项,就打开了项目属性面板,切换到“签名”面板,勾上“为程序集签名(A)”,如图: 在“选择强名称密钥文件(K)”下的下拉菜单,选择“新建”,弹出“创建强名称密钥”面板,输入一个名称,如:key,并把“使用密码保护密钥文件(P)”前面的勾去掉,如图: 点击确定,然后保存,关闭属性面板,这样我们就为项目添加了强命名。如图: 3、添加.ascx文件和XML文件右键点击项目名称,依次选择:添加-〉新建项,打开添加新项面板,选择“文本文件”,并把名称命名为:CustomStudy.ascx(你也可以命名为其他名称),如图: 点击添加按钮,即可添加一个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" %> 这个和我上面提到的那个testcustom一定要相同<SharePoint:RenderingTemplate ID="testcustom" runat="server"> <Template> <div> <div class="" style="width: 100%;"> 国家:<asp:TextBox ID="txtCountry" runat="server" Width="90%" MaxLength="100"></asp:TextBox> </div> <div class="" style="width: 100%;"> 省:<asp:TextBox ID="txtProvince" runat="server" Width="90%" MaxLength="100"></asp:TextBox> </div> <div class="" style="width: 100%;"> 城市:<asp:TextBox ID="txtCity" runat="server" MaxLength="50"></asp:TextBox> </div> </div> </Template> </SharePoint:RenderingTemplate> 下面我们添加XML文件,注意:此文件一定要以fldtypes_开头,和添加ascx文件一样,打开添加新项面板,这次选择添加XML文件,命名为fldtypes_CustomStudy.xml,并添加如下代码: <?xml version="1.0" encoding="utf-8" ?> <FieldTypes> <FieldType> <Field Name="TypeName">地区信息</Field> <Field Name="ParentType">MultiColumn</Field> <Field Name="TypeDisplayName">地区信息</Field> <Field Name="TypeShortDescription">地区信息(含国家、省、城市)</Field> <Field Name="UserCreatable">TRUE</Field> <Field Name="ShowOnListAuthoringPages">TRUE</Field> <Field Name="ShowOnDocumentLibraryAuthoringPages">TRUE</Field> <Field Name="ShowOnSurveyAuthoringPages">TRUE</Field> <Field Name="ShowOnColumnTemplateAuthoringPages">TRUE</Field> <Field Name="FieldTypeClass">CustomStudy.CustomStudy,CustomStudy, Version=0.0.0.0, Culture=neutral, PublicKeyToken=37319c032972f834</Field> <PropertySchema> <Fields> <Field Name="Country" DisplayName="国家" DisplaySize="30" Type="Text"> <Default></Default> </Field> <Field Name="Province" DisplayName="省" DisplaySize="30" Type="Text"> <Default></Default> </Field> <Field Name="City" DisplayName="城市" DisplaySize="30" Type="Text"></Field> </Fields> </PropertySchema> <RenderPattern Name="DisplayPattern"> <Default> <Column SubColumnNumber="0" HTMLEncode="TRUE" /> <HTML><![CDATA[<BR>]]></HTML> <Column SubColumnNumber="1" HTMLEncode="TRUE" /> <HTML><![CDATA[<BR>]]></HTML> <Column SubColumnNumber="2" HTMLEncode="TRUE" /> <HTML><![CDATA[<BR>]]></HTML> </Default> </RenderPattern> </FieldType> </FieldTypes> CustomStudy.CustomStudy,CustomStudy, Version=0.0.0.0, Culture=neutral, PublicKeyToken=37319c032972f834 这段代码,要用Reflector反编译出来,如果没有Reflector,就自己想办法找个。其中,CustomStudy.CustomStudy,前一个CustomStudy是命名空间,后一个CustomStudy是你编译生成的dll文件的名称,CustomStudy, Version=0.0.0.0,这个CustomStudy是你编译生成的dll文件名称。 <PropertySchema>节是控制字段的显示,<RenderPattern Name="DisplayPattern">节是控制字段的样式的。到这里,我们的编码工作基本完成,接下来我们要部署我们的自定义字段了。 4、自定义字段的部署 A. 把我们的编译生成的dll文件拖到C:/WINDOWS/assembly文件夹下,直接用鼠标拖放就可。 B.Copy UI用户控件(ascx文件)到C:/Program Files/Common Files/Microsoft Shared/web server extensions/12/TEMPLATE/CONTROLTEMPLATES文件夹下 C.Copy类型定义文件(fldtypes_CustomStudy.xml)到:C:/Program Files/Common Files/Microsoft Shared/web server extensions/12/TEMPLATE/XML文件夹下。 D.重起IIS,开始-〉运行里,直接输入iisreset 部署完之后,在创建栏的时候,就会看到我们开发的自定义字段类型了。好,到此,自定义字段的学习算略知皮毛,如有错误欢迎大家指正,不胜感激!下面我们就开始webpart的学习。