创建具有属性值的MOSS2007自定义字段实例(包括步骤与源代码)

来源:互联网 发布:厦门广电网络 电话 编辑:程序博客网 时间:2024/05/01 14:14

创建具有属性值的MOSS2007自定义字段实例(包括步骤与源代码)
 

1.       首先创建一个Field 项目CustomFields.

2.       添加三个类文件:FieldAddressValue.cs ,FieldAddress.cs,AddressFieldControl.cs三个文件.

 

1)  FieldAddressValue.cs源代码如下:


using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
using System.Web;

namespace CustomFields
{
    class FieldAddressValue : SPFieldMultiColumnValue
    {
        private const int numberOfFields = 4;

        public FieldAddressValue() : base(numberOfFields) { }

        public FieldAddressValue(string value) : base(value) { }

        public string Address
        {
            get { return this[0]; }
            set { this[0] = value; }
        }

        public string Zip
        {
            get { return this[1]; }
            set { this[1] = value; }
        }

        public string City
        {
            get { return this[2]; }
            set { this[2] = value; }
        }

        public string Country
        {
            get { return this[3]; }
            set { this[3] = value; }
        }
    }
}


2)      FieldAddress.cs源代码如下:


using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using CustomFields.WebControls;

namespace CustomFields
{
    class FieldAddress : SPFieldMultiColumn
    {
        public FieldAddress(SPFieldCollection fields, string fieldName) : base(fields, fieldName) { }
        public FieldAddress(SPFieldCollection fields, string typeName, string displayName) : base(fields, typeName, displayName) { }

        public override BaseFieldControl FieldRenderingControl
        {
            get
            {
                 BaseFieldControl fldControl = new AddressFieldControl();
                fldControl.FieldName = InternalName;
                return fldControl;
            }
        }

        public override object  GetFieldValue(string value)
        {
               if(string .IsNullOrEmpty(value))
                  return null;
            return new FieldAddressValue(value);
        }
    }
}


 

3)      AddressFieldControl.cs源代码如下:

 

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Web;
using System.Web.UI.WebControls;

namespace CustomFields.WebControls
{
    class AddressFieldControl : BaseFieldControl
    {
        protected TextBox addressBox;
        protected TextBox zipBox;
        protected TextBox cityBox;
        protected TextBox countryBox;

        protected override string DefaultTemplateName
        {
            get
            {
                return "AddressFieldRendering";
            }
        }

        public override object Value
        {
            get
            {
                EnsureChildControls();
                FieldAddressValue fieldValue = new FieldAddressValue();
                fieldValue.Address = addressBox.Text.Trim();
                fieldValue.Zip = zipBox.Text.Trim();
                fieldValue.City = cityBox.Text.Trim();
                fieldValue.Country = countryBox.Text.Trim();

                return fieldValue;
            }
            set
            {
                EnsureChildControls();
                FieldAddressValue fieldValue = (FieldAddressValue)value;
                addressBox.Text = fieldValue.Address;
                zipBox.Text = fieldValue.Zip;
                cityBox.Text = fieldValue.City;
                countryBox.Text = fieldValue.Country;

            }
        }

        public override void Focus()
        {
            EnsureChildControls();
            addressBox.Focus();
        }

        protected override void CreateChildControls()
        {
            if (Field == null)
                return;

            base.CreateChildControls();

            if (ControlMode == SPControlMode.Display)
                return;

            addressBox = (TextBox)TemplateContainer.FindControl("addressBox");
            if (addressBox == null)
                throw new ArgumentException("Corrupted AddressFieldRendering template - missing addressBox. ");

            addressBox.TabIndex = TabIndex;
            addressBox.CssClass = CssClass;
            addressBox.ToolTip = Field.Title + " Address";

            zipBox = (TextBox)TemplateContainer.FindControl("zipBox");
            if (zipBox == null)
                throw new ArgumentException("corrupted AddressFieldRendering template - missing zipBox.");
            zipBox.TabIndex = TabIndex;
            zipBox.CssClass = CssClass;
            zipBox.ToolTip = Field.Title + " Zipcode";

            cityBox = (TextBox)TemplateContainer.FindControl("cityBox");
            if (cityBox == null)
                throw new ArgumentException("corrupted AddressFieldRendering template - missing cityBox.");
            cityBox.TabIndex = TabIndex;
            cityBox.CssClass = CssClass;
            cityBox.ToolTip = Field.Title + " City";

            countryBox = (TextBox)TemplateContainer.FindControl("countryBox");
            if (countryBox == null)
                throw new ArgumentException("corrupted AddressFieldRendering template - missing countryBox.");
            countryBox.TabIndex = TabIndex;
            countryBox.CssClass = CssClass;
            countryBox.ToolTip = Field.Title + " Country";

            if (ControlMode == SPControlMode.New)
            {
                addressBox.Text = Field.GetCustomProperty("DefaultStreet").ToString();
                zipBox.Text = Field.GetCustomProperty("DefaultZip").ToString();
                cityBox.Text = Field.GetCustomProperty("DefaultCity").ToString();
                countryBox.Text = Field.GetCustomProperty("DefaultCountry").ToString();

            }

           
        }


    }
}


3.       强名称编译程序集.

4.       添加一个类型定义文件fldtypes_custom.xml.

 

fldtypes_custom.xml文件内容如下:

 


<?xml version="1.0" encoding="utf-8"?>
<FieldTypes>
  <FieldType>
    <Field Name="TypeName">Address</Field>
    <Field Name="ParentType">MultiColumn</Field>
    <Field Name="TypeDisplayName">Address</Field>
    <Field Name="TypeShortDescription">Address (street + nr, zip, city and country)</Field>
    <Field Name="UserCreatable">TRUE</Field>
    <Field Name="ShowOnListCreate">TRUE</Field>
    <Field Name="ShowOnDocumentLibraryCreate">TRUE</Field>
    <Field Name="ShowOnSurveyCreate">TRUE</Field>
    <Field Name="ShowOnColumnTemplateCreate">TRUE</Field>
    <Field Name="FieldTypeClass">CustomFields.FieldAddress,CustomFields, Version=1.0.0.0, Culture=neutral, PublicKeyToken=55a361e8b234515f</Field>
    <PropertySchema>
      <Fields>
        <Field Name="DefaultStreet" DisplayName="Default Street:" MaxLength="50" DisplaySize="30" Type="Text">
          <Default>XiaoYuan Road</Default>
        </Field>
        <Field Name="DefaultZip" DisplayName="Default Zip:" MaxLength="10" DisplaySize="10" Type="Text">
          <Default>100027</Default>
        </Field>
        <Field Name="DefaultCity" DisplayName="Default City:" MaxLength="50" DisplaySize="30" Type="Text">
          <Default>Beijing</Default>
        </Field>
        <Field Name="DefaultCountry" DisplayName="Default Country:" MaxLength="50" DisplaySize="30" Type="Text">
          <Default>China</Default>
        </Field>
      </Fields>
    </PropertySchema>
    <RenderPattern Name="DisplayPattern">
      <Switch>
        <Expr><Column/></Expr>
        <Case Value="">
        </Case>
        <Default>
          <Column SubColumnNumber="0" HTMLEncode="TRUE" />
          <HTML><![CDATA[<BR>]]></HTML>
          <Column SubColumnNumber="1" HTMLEncode="TRUE"/>
          <HTML><![CDATA[&nbsp;----&nbsp;]]></HTML>
          <Column SubColumnNumber="2" HTMLEncode="TRUE"/>
          <HTML><![CDATA[<BR>]]></HTML>
          <Column SubColumnNumber="3" HTMLEncode="TRUE"/>
        </Default>
      </Switch>
    </RenderPattern>
  </FieldType>
</FieldTypes>


5.       添加一个模板文件AddressFieldRendering.ascx.

 


AddressFieldRendering.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="AddressFieldRendering" runat="server">
    <Template>
        <table class="ms-form">
            <tr>
                <td>Address:</td>
                <td><asp:TextBox ID="addressBox" MaxLength="255" size="50" runat="server" /></td>
            </tr>
            <tr>
                <td>Zip:</td>
                <td><asp:TextBox ID="zipBox" MaxLength="10" size="5" runat="server" /></td>
            </tr>
            <tr>
                <td>City:</td>
                <td><asp:TextBox ID="cityBox" MaxLength="50" size="15" runat="server" /></td>
            </tr>
             <tr>
                <td>Country:</td>
                <td><asp:TextBox ID="countryBox" MaxLength="50" size="15" runat="server" /></td>
            </tr>
        </table>
    </Template>
</SharePoint:RenderingTemplate>


6.       部署.

1)      把 程序集CustomFields加入GAC.

2)      把类型定义文件fldtypes_custom.xml拷贝到目录c:/program.../12/TEMPLATE/XML下.

3)      把模板文件AddressFieldRendering.ascx拷贝到目录c:/program.../12/TEMPLATE/CONTROLTEMPLATES下.

4)      重起IIS.


     项目文件下载