SharePoint列表自定义字段实现

在WSS 3.0中,每个列表项都有一个只读的ID字段。然而,SharePoint开发者可能会发现,在自定义列表项时,利用这个ID字段并不方便。他们需要一个唯一的键字段,这个字段是只读的,并且其值可以与ID字段同步。更进一步,如果能够像“项目ID 1001, 1002”或“销售订单70001, 70002”这样自定义其值就更好了。

使用代码实现

实现这个唯一键字段的逻辑包括两部分:一个自定义的整数字段类型,它是只读的;以及一个事件处理特性,它会自动将新项的值加一。

首先,让看看自定义字段类型的代码:

public class CodeProjectNumberField : NumberField { protected override void Render(System.Web.UI.HtmlTextWriter output) { try { if (Controls.Count > 0) { ((TemplateBasedControl)Controls[0]).TemplateName = "~/_controltemplates/CustomTemplates.ascx"; base.Render(output); output.Write("Read Only Field"); } else base.Render(output); } catch (Exception ex) { PwCPMOExceptionLogging.Error(ex); } } }

在项目自定义字段类型中,定制了数字字段控件的模板为customTemplate.ascx。在这个自定义模板文件中,可以轻松地将数字字段控件设置为只读。请检查自定义模板文件,并与HIV12\TEMPLATE\CONTROLTEMPLATES\DefaultTemplates.ascx进行比较。

现在,让介绍事件处理特性。将在ItemAdded事件时设置键字段值并格式化它:

public class ReceiverHandler : SPItemEventReceiver { public override void ItemAdded(SPItemEventProperties properties) { string CodeProjectCustomFieldName = ConfigurationSettings.AppSettings["ProjectChangeTrackingNumberFieldName"]; string CodeProjectCustomFieldSeed = ConfigurationSettings.AppSettings["ProjectChangeTrackingNumberFieldSeed"]; if (!properties.ListItem.Fields.ContainsField(CodeProjectCustomFieldName)) return; int intCodeProjectCustomFieldSeed = 1000; Int32.TryParse(CodeProjectCustomFieldSeed, out intCodeProjectCustomFieldSeed); properties.ListItem[CodeProjectCustomFieldName] = (properties.ListItem.ID + intCodeProjectCustomFieldSeed).ToString(); properties.ListItem.SystemUpdate(); } }

在web.config文件中设置了FieldName和ListName,以强制这个事件处理特性只影响定义的字段。还需要定义字段种子以自定义值格式。然后,根据项ID值计算新的字段值...

注意事项

在创建和部署所有事件处理特性和自定义字段类型之后,必须定制HIV12\Template\XML下的FLDTYPES.XML,以使新字段类型在创建新列表列时出现。(建议创建另一个FLDTYPES.XML,如fldtypes_codeproject.xml,而不是使用现有的。原因是它可能在WSS更新时被覆盖。)

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485