Aus der Praxis – Ein einfaches Feld für die Anzeige berechneter Werte
avatar

Es gibt diverse Artikel zur Erstellung von Custom Field Types für SharePoint 2010, von denen einige auch berechnet Felder (Computed Fields) behandeln. Leider reichte keines dieser Beispiele für meine Anforderungen aus.

Ich benötigte ein berechnetes Feld, das mit den von ihm errechneten Wert nicht nur darstellt, sondern soweit auch am Listenelement speichert, dass man ihn bei CAML Query wieder abrufen kann. Genau an dieser Stelle bekommt nämlich ein einfaches berechnetes Feld Probleme, wenn es nur für die Anzeige von Werten genutzt wird, die auf anderen Spalten basieren.

In meinem Fall ging es darum, den Namen der Liste, in der ein Dokument liegt, als „Arbeitsbereich” anzeigen zu lassen.

Hier nun also meine Lösung für das Problem. Ich mache es mir einfach, indem ich meinen neuen Feldtyp vom Textfeld erben lasse. Daher fällt die Implementierung sehr einfach aus:

1. Definition des Custom Field Types

<FieldType>
  <Field Name="TypeName">ComputedWorkspace</Field>
  <Field Name="TypeDisplayName">$Resources:core,fldtype_computed;</Field>
  <Field Name="ParentType">Text</Field>
  <Field Name="FieldTypeClass">HanseVision.SharePoint.Common.FieldComputedWorkspace, HanseVision.SharePoint.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=11e99323d9a1fb04</Field>
  <Field Name="UserCreatable">FALSE</Field>
  <Field Name="Sortable">TRUE</Field>
  <Field Name="Filterable">TRUE</Field>
  <Field Name="CAMLRendering">FALSE</Field>
</FieldType>

Um sicherzustellen, dass der Feldtyp nicht von anderen Benutzer verwendet wird (und so evtl. fehlerhaftes Verhalten an den Tag legt), setze ich die Eigenschaft “UserCreatable” auf false. Nun kann der Feldtyp nicht mehr über die SharePoint Oberfläche genutzt werden.

Die Klasse für den Feldtyp ist sehr einfach aufgebaut:

namespace HanseVision.SharePoint.Common
{
    /// <summary>
    /// This class is used to introduce a custom field type used for computed workspace based on list name of current item.
    /// </summary>
    [CLSCompliant(false)]
    public class FieldComputedWorkspace : SPFieldText
    {
        public FieldComputedWorkspace(SPFieldCollection fields, string fieldName)
            : base(fields, fieldName) { }

        public FieldComputedWorkspace(SPFieldCollection fields, string typeName, string displayName)
            : base(fields, typeName, displayName) { }

        public override Microsoft.SharePoint.WebControls.BaseFieldControl FieldRenderingControl
        {
            get
            {
                BaseFieldControl control = new ComputedWorkspaceFieldControl();
                control.FieldName = this.InternalName;
                return control;
            }
        }
    }
}

2. Erstellung des Field Controls

Ein eigenes Field Control incl. Rendering Control ist nötig, da an dieser Stelle das Verhalten des Standard Textfeldes überschrieben werden soll. Im FieldControl wird die Textbox mit dem gewünschten Wert gefüllt, wenn sich das Control im “Neu”- oder “Bearbeiten”-Modus befindet. Der Wert wird dann vom Standardmechanismus des Textfeldes am Listenelement gespeichert.

namespace HanseVision.SharePoint.Common
{
    [CLSCompliant(false)]
    public class ComputedWorkspaceFieldControl : TextField
    {
        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            
            if ((ControlMode == SPControlMode.Edit || ControlMode == SPControlMode.New) &amp;&amp; base.List != null)
            {
                textBox.Text = base.List.Title;
            }
        }

        protected override string DefaultTemplateName
        {
            get
            {
                return "ComputedWorkspaceField";
            }
        }
    }
}

Das zugehörige Rendering Template hat keine andere Aufgabe, als die Textbox schreibgeschützt zu setzen. An dieser Stelle könnten noch andere Anpassung für die Darstellung vorgenommen werden.

<SharePoint:RenderingTemplate id="ComputedWorkspaceField" runat="server">
    <Template>
        <asp:TextBox id="TextField" Enabled="false" maxlength="255" runat="server"/><br />
    </Template>
</SharePoint:RenderingTemplate>

3. Nutzung des neuen Feldtyps in der Definition von Websitespalten

Die Nutzung des Feldtyps entspricht der Nutzung eines normalen Textfeldes. In einer elements.xml eines Features sieht das dann z.B. so aus:

<Field ID="{0CA398BD-749F-4616-A5A3-3B700BFE5137}" Name="HvWorkspace" Type="ComputedWorkspace" 
        DisplayName="Arbeitsbereich" ReadOnly="False" Group="HanseVision" ShowInDisplayForm="TRUE" 
        ShowInEditForm="TRUE" ShowInNewForm ="TRUE" Description="Dieses Feld wird automatisch berechnet." />

Schreibe einen Kommentar