65.9K
CodeProject 正在变化。 阅读更多。
Home

如何构建一个 WSS 自定义列表项 ID 字段

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2009年2月23日

CDDL

2分钟阅读

viewsIcon

59735

downloadIcon

206

介绍如何在 SharePoint 列表中创建一个键列。

引言

本文介绍如何在 SharePoint 列表中创建一个键列。

背景

在 WSS 3.0 中,每个列表项都有一个只读的 ID 字段。然而,SharePoint 开发人员可能会发现很难在自定义列表项中利用 ID 字段。他们需要一个唯一的键字段,该字段是只读的,并且其值可以与 ID 字段同步。此外,最好使其值可自定义,例如 项目 ID 1001, 1002销售订单 70001, 70002...

Using the Code

实现此唯一键字段的逻辑包括两部分:一个自定义字段类型,它是一个整数并且是只读的,以及一个事件处理程序功能,该功能自动将新项目的值加 1。

让我们首先查看自定义字段类型中的代码

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 文件中设置 FieldNameListName,以强制此事件处理程序仅影响我们定义的字段。我们还必须定义字段种子以自定义值格式。然后,我们根据项目 ID 值计算新的字段值...

有一点很重要,在创建并部署所有事件处理程序和自定义字段类型后,我们必须自定义 HIV12\Template\XML 文件夹下的 FLDTYPES.XML,以使新的字段类型在创建新的列表列时出现。(我建议创建一个新的 FLDTYPES.XML,例如 fldtypes_codeproject.xml,而不是使用现有的一个。原因是 WSS 更新时可能会覆盖它。)

关注点

在弄清楚这个解决方案的过程中,我感到 Microsoft SharePoint 团队一直在努力改进他们的产品,以满足最终用户的需求,我相信我们将在下一个版本中看到 Microsoft 对此问题的实现。

历史

我会继续更新,因为我深入研究 SharePoint 世界。事实上,像这样的大量问题。我认为如果 Microsoft 在发布下一个版本之前获得更多时间,他们可以使 WSS 3.0 更好。

© . All rights reserved.