|
<div id="cnblogs_post_body"> SharePoint 2010自带字段类型有很多,如单行文本,日期时间,下拉列表,数字等等。但往往这些不能满足我们的需要,比如要求一个大写金额的字段,用户输入数字,要求显示成大写,这时候就不能满足需求了。那么我们就要使用自定义开发的字段类型了。下面以开发大写金额字段来说明SharePoint 2010自定义字段开发。
SharePoint 2010创建栏时默认的字段类型如下:

开发自定义的大写金额类型后,也会在这里出现,如下图

先看一下效果吧,首先创建一个数字字段,即是用户输入数字的字段,点击确定。

然后再创建一个我们开发的大写金额字段

创建完这两个字段后,在列表上点击添加新项目

当在小写文本框内输入数字,大写金额会自动跟着显示出来,如下图

看到效果后,下面介绍大写金额字段下实现过程。
1、先了解MOSS内部的字段类型,如下表,大写金额字段继承 SPFieldMultiColumn这字段类型开发。
SPFieldText
| 单行文本
| 这个可能是用的最为广泛的字段类型了,它的输入界面就是一个单行文本框,没有数据验证功能(除了是否为空)。可以设置最大长度(局限在255以内)。
| SPFieldMultiLineText
| 多行文本
| 输入界面是一个textarea,根据设置不同,可以是纯文本或者是带格式文本的(按照html格式保存的)。
| SPFieldNumber
| 数字
| 输入界面是textbox,但是带有数据验证(是否为数字,以及最大/最小值等)。
| SPFieldCurrency
| 货币
| 和数字其实差不多,只不过现实的时候会多一个货币符号。
| SPFieldBoolean
| 是/否
| 一个CheckBox
| SPFieldDateTime
| 日期
| 一个带picker的textbox,可以选择&ldquo;日期和时间&rdquo;或&ldquo;仅日期&rdquo;
| SPFieldChoice
| 选项(单选)
| 可以以dropdownlist或者radio button的形式出现。这个字段有点点特别,虽然它看上去只能存一个值,但其实它是多选类(SPFieldMultiChoice)的子类
| SPFieldMultiChoice
| 选项(多选)
| 如果使用多选,那么是通过一组checkbox输入的。在这个类里面定义了这个字段中究竟有哪些选项(通过Choices属性,自然,作为它子类的SPFieldChoice也有这个属性)。于之相对应的,可以通过SPFieldMultiChoiceValue类来访问它的值。
| SPFieldRatingScale
| 评估范围
| 刚才介绍过了,它其实也是多选类(SPFieldMultiChoice)的子类。于之对应的值类型为SPFieldRatingScaleValue
| SPFieldUrl
| 链接或图片
| 可以是链接,也可以是图片,它包含url和描述信息两个部分,通过其值类型SPFieldUrlValue可以很方便的得到这两部分。
| SPFieldLookup
| 查阅项
| 通过dropdownlist完成单选,一个特殊的listbox完成多选(wss3.0支持查阅项多选了!),由于每个被查阅的项会有id和文本,所以也需要有值类型,这个比较特殊,有两种值类型,SPFieldLookupValue和SPFieldLookupValueCollection(因为支持多选了嘛)。然后在SPFieldLookup类中,定义了要查阅哪个列表的哪个字段,以及是哪个网站上的列表。是的!wss3.0中的查阅项其实是支持跨网站查阅的(通过设定LookupWebId属性),但是在默认的界面上并没有暴露出一点。所以一个跨网站查阅项是一个很值得一做的自定义字段类型!
| SPFieldUser
| 用户和用户组
| 它的输入是通过一个带有AJAX支持的输入框完成的,这是一个很强大的控件。其实这个类是SPFieldLookup的子类,因为它们做的事情在本质上都差不多。相应的,其值类型SPFieldUserValue也是SPFieldLookupValue的子类,还有SPFieldUserValueCollection&hellip;&hellip;
| SPFieldMultiColumn
| 多栏
| 这是另一个很特殊的字段类型,默认情况下我们无法直接使用它,使用它的唯一途径就是通过自定义字段类型继承它来完成我们的需求。顾名思义,这是一个能在一个字段中储存多个信息的字段类型。
| 大写金额字段项目目录情况

SPLegalAmountField.cs代码
<div class="cnblogs_code">using System;using System.Collections.Generic;using System.Linq;using System.Text;using Microsoft.SharePoint;using Microsoft.SharePoint.WebControls;using System.Xml;using System.Reflection;using Microsoft.SharePoint.Security;using System.Security.Permissions;using System.Text.RegularExpressions;using System.Collections.Specialized;namespace FlowMan.WebControls.SPLegalAmountField{ [CLSCompliant(false)] public class SPLegalAmountField : SPFieldMultiColumn { //创建字段保存创建配置属性:关联的小写字段 const string SPLegalAmountField_RELEVANCELISTFIELD = "SPLegalAmountFieldRelevanceListField"; //创建字段保存创建配置属性:呈现出来的大小金额文本框长度 const string SPLegalAmountField_TEXTBOXWIDTH = "SPLegalAmountFieldTextboxWidth"; public SPLegalAmountField(SPFieldCollection fields, string fieldname) : base(fields, fieldname) { _splegalAmountFieldRelevanceListField = "" + base.GetCustomProperty(SPLegalAmountField_RELEVANCELISTFIELD); _splegalAmountFieldTextboxWidth = "" + base.GetCustomProperty(SPLegalAmountField_TEXTBOXWIDTH); } public SPLegalAmountField(SPFieldCollection fields, string typeName, string displaydname) : base(fields, typeName, displaydname) { _splegalAmountFieldRelevanceListField = "" + base.GetCustomProperty(SPLegalAmountField_RELEVANCELISTFIELD); _splegalAmountFieldTextboxWidth = "" + base.GetCustomProperty(SPLegalAmountField_TEXTBOXWIDTH); } public override object GetFieldValue(string value) { if (string.IsNullOrEmpty(value)) return null; return new SPLegalAmountFieldValue(value); } private string _splegalAmountFieldRelevanceListField; private string _splegalAmountFieldTextboxWidth; public string SPLegalAmountFieldRelevanceListField { get { return _splegalAmountFieldRelevanceListField; } set { _splegalAmountFieldRelevanceListField = value; this.SetCustomPropertytoCache(SPLegalAmountField_RELEVANCELISTFIELD, value); } } public string SPLegalAmountFieldTextboxWidth { get { return _splegalAmountFieldTextboxWidth; } set { _splegalAmountFieldTextboxWidth = value; this.SetCustomPropertytoCache(SPLegalAmountField_TEXTBOXWIDTH, value); } } private static readonly Dictionary<string, StringDictionary> CustomPropertiesCache = new Dictionary<string, StringDictionary>(); private string ContextKey { get { return this.ParentList.ID.ToString() + "_" + System.Web.HttpContext.Current.GetHashCode(); } } protected void SetCustomPropertytoCache(string key, string value) { StringDictionary plist = null; if (CustomPropertiesCache.ContainsKey(ContextKey)) { plist = CustomPropertiesCache[ContextKey]; } else { plist = new StringDictionary(); CustomPropertiesCache.Add(ContextKey, plist); } if (plist.ContainsKey(key)) { plist[key] = value; } else { plist.Add(key, value); } } protected string GetCustomPropertyFromCache(string key) { if (CustomPropertiesCache.ContainsKey(ContextKey)) { StringDictionary plist = CustomPropertiesCache[ContextKey]; if (plist.ContainsKey(key)) return plist[key]; else return ""; } else { return ""; } } public override void OnAdded(SPAddFieldOptions op) { base.OnAdded(op); Update(); } public override void Update() { base.SetCustomProperty(SPLegalAmountField_RELEVANCELISTFIELD, this.GetCustomPropertyFromCache(SPLegalAmountField_RELEVANCELISTFIELD)); base.SetCustomProperty(SPLegalAmountField_TEXTBOXWIDTH, this.GetCustomPropertyFromCache(SPLegalAmountField_TEXTBOXWIDTH)); base.Update(); } public override BaseFieldControl FieldRenderingControl { [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)] get { BaseFieldControl _renderingControl = new SPLegalAmountFieldControl(); _renderingControl.FieldName = InternalName; return _renderingControl; } } /// <summary> /// 提交表单时候的验证数据类型 /// </summary> /// <param name="value"></param> /// <returns></returns> public override string GetValidatedString(object value) { string strValue = "" + value; if (Required && strValue == "") { throw new SPFieldValidationException(System.Web.HttpContext.GetGlobalResourceObject("FlowMan.WebControls", "SPLegalAmountField_Required").ToString()); } return base.GetValidatedString(value); } }} |
|