在MOSS里面,有很多地方都要用到自定义字段类行,比如说,有的用户要做一个工作流的表单,但是有的用户不想用InfoPath,那怎么办。那我们就用MOSS自定义定义一个表单出来
这个时候,我们就可以定制很强大的自定义类型出来,我下面的这个Demo是当然用户要申请一个任务的时候,制动的把当前的用户给读出来,不用用户在来自己输入一次。Demo其实很简单。但是,通过这个列子。可以让我们明白很多的道理,让我们去实现更强大的功能。。
首先要创建3个类。。
//这个是呈现类
using System;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.Security;
namespace CustomFieldType
{
[Guid("daf7f358-83fa-41e9-915b-43de0e02ae57")]
public class FieldControlField : SPFieldMultiColumn
{
public FieldControlField(SPFieldCollection fields, string fieldName)
: base(fields, fieldName)
{
}
public FieldControlField(SPFieldCollection fields, string typeName, string displayName)
: base(fields, typeName, displayName)
{
}
public override BaseFieldControl FieldRenderingControl
{
//[SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)]
get
{
BaseFieldControl fieldControl = new FieldControlFieldControl();
fieldControl.FieldName = this.InternalName;
return fieldControl;
}
}
public override object GetFieldValue(string value)
{
//return base.GetFieldValue(value);
if (string.IsNullOrEmpty(value))
return null;
return new FieldControlFieldValue(value);
}
}
}
//大家一看就知道噢,这个就是控件类
using System;
using System.Runtime.InteropServices;
using System.Web;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
namespace CustomFieldType
{
[Guid("9714413c-bf5a-4372-bdf2-d5d2f2599124")]
public class FieldControlFieldControl : BaseFieldControl
{
protected TextBox tbName;
protected override string DefaultTemplateName
{
get
{
//return base.DefaultTemplateName;
return "GetNameFieldControl";
}
}
public override object Value
{
get
{
//return base.Value;
EnsureChildControls();
FieldControlFieldValue fieldValue = new FieldControlFieldValue();
fieldValue.Name = tbName.Text.Trim().ToString();
return fieldValue;
}
set
{
// base.Value = value;
EnsureChildControls();
FieldControlFieldValue fv = (FieldControlFieldValue)value;
tbName.Text = fv.Name;
}
}
public override void Focus()
{
//base.Focus();
EnsureChildControls();
tbName.Focus();
}
public string GetCurrName()
{
string UserName = default(System.String);
SPSite site = new SPSite(@"http://lh-vmpc/personal/test");
SPWeb web = site.OpenWeb();
UserName = web.CurrentUser.Name;
return UserName;
}
protected override void CreateChildControls()
{
//base.CreateChildControls();
if (Field == null) return;
base.CreateChildControls();
if (ControlMode == SPControlMode.Display)
{
return;
}
tbName = (TextBox)TemplateContainer.FindControl("tbName");
tbName.TabIndex = TabIndex;
tbName.CssClass = CssClass;
tbName.ToolTip = Field.Title + "Name";
if (tbName == null)
{
throw new ArgumentException("tbName is null");
}
if (ControlMode == SPControlMode.New)
{
tbName.Text = this.GetCurrName();
}
}
}
}
//这个是个初始化 保存值的//
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
using System.Web;
namespace CustomFieldType
{
class FieldControlFieldValue:SPFieldMultiColumnValue
{
private const int numberOfFields = 1;
public FieldControlFieldValue() : base(numberOfFields) { }
public FieldControlFieldValue(string value) : base(value) { }
public string Name
{
get { return this[0]; }
set { this[0] = value; }
}
}
}
这个是一个XML文件
名字一定要以fldtypes开头
<?xml version="1.0" encoding="utf-8" ?>
<FieldTypes>
<FieldType>
<Field Name="TypeName">Name</Field>
<Field Name="ParentType">FieldChoice</Field>
<Field Name="TypeDisplayName">Name</Field>
<Field Name="TypeShortDescription">Name</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">CustomFieldType.FieldControlField,CustomFieldType, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5</Field>
<PropertySchema>
<Fields>
<Field Name="DefaultName" DisplayName="Default Name:" MaxLength="50" DisplaySize="30" Type="Text">
<Default>Name</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[ ---- ]]></HTML>
<Column SubColumnNumber="2" HTMLEncode="TRUE"/>
<HTML><![CDATA[<BR>]]></HTML>
<Column SubColumnNumber="3" HTMLEncode="TRUE"/>
</Default>
</Switch>
</RenderPattern>
</FieldType>
</FieldTypes>
最后是一个用户控件的代码,直接COPY就OK拉
<%@ 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="GetNameFieldControl" runat="server">
<Template>
<table class="ms-form">
<tr>
<td><asp:TextBox ID="tbName" MaxLength="255" size="50" runat="server" /></td>
</tr>
</table>
</Template>
</SharePoint:RenderingTemplate>
最后是部署拉。。部署也很简单 。。
部署.
1) 把 程序集加入GAC.
2) 把类型定义文件fldtypes_*.xml拷贝到目录c:\program...\12\TEMPLATE\XML下.
3) 把模板文件用户控件拷贝到目录c:\program...\12\TEMPLATE\CONTROLTEMPLATES下.
4) 重起IIS.