在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更新时被覆盖。)