Cette documentation est archivée et n’est pas conservée.

Procédure pas à pas : création d'un type de champ personnalisé

Windows SharePoint Services 3

Cette rubrique fournit un guide pas à pas pour la création d'un type de champ personnalisé dans la situation la plus courante : le rendu du champ dans une vue de liste et en mode d'affichage est géré par un RenderPattern dans le fichier de définition de champ, tandis que le rendu de champ dans les modes Création et Édition est géré par un modèle de rendu unique qui fonctionne conjointement avec la méthode CreateChildControls. Vous allez créer un champ qui est destiné à contenir à 10 chiffres ISBN (International Standard Book Number).

Cette procédure pas à pas suppose que les applications suivantes sont installées sur un ordinateur qui exécute le système d'exploitation Windows Server 2003 :

  • Windows SharePoint Services 3.0

  • Microsoft Visual Studio 2005

  • Extensions Microsoft Visual Studio 2005 pour Windows SharePoint Services 3.0, version 1.0 ou ultérieure

  1. Dans Visual Studio, sélectionnez Outils externes dans le menu Outils.

  2. Dans la boîte de dialogue Outils externes, cliquez sur Ajouter, puis tapez Obtenir la clé publique de l'assembly pour le Titre.

  3. Renseignez la zone de texte Commande en accédant au fichier sn.exe. Il est généralement installé à l'emplacement suivant : C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sn.exe.

  4. Dans la zone de texte Arguments, tapez le texte suivant (en respectant la casse) -TP "$ (TargetPath)" .

  5. Activez la case à cocher Utiliser la fenêtre de résultat.

  6. Cliquez sur OK. La nouvelle commande est ajoutée au menu Outils.

Pour configurer le projet de champ personnalisé

  1. Dans Visual Studio 2005, sélectionnez Nouveau projet dans le menu Fichier.

  2. Dans la boîte de dialogue Nouveau projet, sélectionnez SharePoint dans la fenêtre Types de projets. (En l'absence d'option de projet SharePoint dans la fenêtre, vous devez installer les extensions Visual Studio 2005 pour Windows SharePoint Services 3.0, version 1.0 ou ultérieure.)

  3. Sélectionnez Vide dans la fenêtre Modèles.

  4. Dans la zone Nom, tapez Type_Champ_ISBN.

  5. Cliquez sur OK.

  6. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet, Type_Champ_ISBN, sélectionnez Propriétés, puis cliquez sur l'onglet Événements de génération.

    Tapez le code ci-après dans la zone Ligne de commande de l'événement après génération. Ces lignes garantissent qu'à chaque fois que vous régénérez le projet, la version la plus récente des fichiers de votre projet est copiée dans l'emplacement correct et Windows SharePoint Services 3.0 est redémarré de sorte qu'il charge la dernière version de l'assembly.

    cd "$(ProjectDir)"
    "%programfiles%\microsoft visual studio 8\sdk\v2.0\bin\gacutil" /i "$(TargetPath)" /nologo /f
    %systemroot%\system32\iisapp.vbs /a "SharePoint_App_Pool" /r
    xcopy *.ascx "C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES\" /y
    xcopy fldtypes*.xml "C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\XML\" /y
    
  7. Remplacez SharePoint_App_Pool par le nom réel du pool d'applications des services Internet (IIS) qui est assigné à votre application Web Windows SharePoint Services 3.0. Il s'agit généralement du même nom que le site Web IIS qui contient l'application ; par exemple, "SharePoint - 80". (Les guillemets peuvent être omis s'il n'y a pas d'espace dans le nom.)

  8. Cliquez sur n'importe quel autre contrôle activé sous l'onglet pour que Visual Studio détecte vos modifications et qu'un astérisque apparaisse sur l'étiquette de l'onglet, puis sélectionnez Enregistrer tout dans le menu Fichier.

  9. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet, Type_Champ_ISBN, sélectionnez Ajouter, puis Nouvel élément.

  10. Dans la boîte de dialogue Ajouter un nouvel élément, sélectionnez SharePoint dans la fenêtre Catégories, puis Contrôle de champ dans la fenêtre Modèles.

  11. Dans la zone Nom, tapez ISBN, puis cliquez sur Ajouter. Cela crée deux fichiers que vous allez modifier dans une étape ultérieure : ISBN.Field.cs et ISBN.FieldControl.cs. Un nom fort est également créé et stocké dans un fichier appelé Temporary.snk dans votre projet.

  12. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet, Type_Champ_ISBN, puis sélectionnez Propriétés.

  13. Ouvrez l'onglet Application et remplacez le Nom de l'assembly par MyCompany.SharePoint .Type_Champ_ISBN. (Dans cette procédure pas à pas, remplacez MyCompany par le nom de votre société.)

  14. Remplacez nom d'espace par défaut par MyCompany.SharePoint.

  15. Cliquez sur le bouton Enregistrer tout dans la barre d'outils.

  16. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nœud Références, puis sélectionnez Ajouter une référence.

  17. Dans la boîte de dialogue Ajouter une référence, ouvrez l'onglet Parcourir et accédez à C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\.

  18. Sélectionnez PresentationFramework.dll, puis cliquez sur OK. (Cet assembly contient la définition de la classe ValidationRule qui est référencée dans le fichier que vous créez dans la procédure suivante.)

Pour créer une classe de règle de validation

  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet, Type_Champ_ISBN, sélectionnez Ajouter, puis Classe.

  2. Sélectionnez Éléments de projet Visual C# dans la fenêtre Catégories, puis Classe dans la fenêtre Modèles.

  3. Dans la zone Nom, tapez ISBN10ValidationRule.cs, puis cliquez sur Ajouter.

  4. Dans le fichier ISBN10ValidationRule.cs qui est créé, ajoutez les instructions using suivantes :

    using System.Text.RegularExpressions;
    using System.Windows.Controls;
    using System.Globalization;
    
  5. Modifiez l'espace de noms pour vous conformer aux directives énoncées dans Namespace Naming Guidelines. Dans cette procédure pas à pas, utilisez MyCompany.System.Windows.Controls.

  6. Remplacez la déclaration de classe par le code suivant :

    public class ISBN10ValidationRule : ValidationRule
    {
        private const Int32 ISBNMODULO = 11;
    
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            String iSBN = (String)value;
            String errorMessage = "";
    
            Regex rxISBN = new Regex(@"^(?'GroupID'\d{1,5})-(?'PubPrefix'\d{1,7})-(?'TitleID'\d{1,6})-(?'CheckDigit'[0-9X]{1})$");
    
            if (!rxISBN.IsMatch(iSBN))
            {
                errorMessage = "An ISBN must have this structure:\n1-5 digit Group ID, hyphen, \n1-7 digit Publisher Prefix, hyphen, \n1-6 digit Title ID, hyphen, \n1 Check Digit (which can be \"X\" to indicate \"10\").\n";
            }
    
            if (errorMessage == "") // Matched the RegEx, so check for group length errors.
            {
                Match mISBN = rxISBN.Match(iSBN);
                GroupCollection groupsInString = mISBN.Groups;
    
                String groupID = groupsInString["GroupID"].Value;
                String pubPrefix = groupsInString["PubPrefix"].Value;
    
                if ((groupID.Length + pubPrefix.Length) >= 9)
                {
                    errorMessage = "The Group ID and Publisher Prefix can total no more than 8 digits.\n";
                }
    
                String titleID = groupsInString["TitleID"].Value;
    
                if (((groupID.Length + pubPrefix.Length) + titleID.Length) != 9)
                {
                    errorMessage = errorMessage + "The Group ID, Publisher Prefix, and \nTitle ID must total exactly 9 digits.\n";
                }
    
                if (errorMessage == "") //No group length errors, so verify the check digit algorithm.
                {
                    Int32 checkDigitValue;
                    String checkDigit = groupsInString["CheckDigit"].Value;
    
                    // To ensure check digit is one digit, "10" is represented by "X".
                    if (checkDigit == "X")
                    {
                        checkDigitValue = 10;
                    }
                    else
                    {
                        checkDigitValue = Convert.ToInt32(checkDigit);
                    }
    
                    String iSBN1st3Groups = groupID + pubPrefix + titleID; //Concatenate without the hyphens.
    
                    // Sum the weighted digits.
                    Int32 weightedSum = (10 * Convert.ToInt32(iSBN1st3Groups.Substring(0, 1))) +
                                         (9 * Convert.ToInt32(iSBN1st3Groups.Substring(1, 1))) +
                                         (8 * Convert.ToInt32(iSBN1st3Groups.Substring(2, 1))) +
                                         (7 * Convert.ToInt32(iSBN1st3Groups.Substring(3, 1))) +
                                         (6 * Convert.ToInt32(iSBN1st3Groups.Substring(4, 1))) +
                                         (5 * Convert.ToInt32(iSBN1st3Groups.Substring(5, 1))) +
                                         (4 * Convert.ToInt32(iSBN1st3Groups.Substring(6, 1))) +
                                         (3 * Convert.ToInt32(iSBN1st3Groups.Substring(7, 1))) +
                                         (2 * Convert.ToInt32(iSBN1st3Groups.Substring(8, 1))) +
                                          checkDigitValue;
    
                    Int32 remainder = weightedSum % ISBNMODULO;  // ISBN is invalid if weighted sum modulo 11 is not 0.
    
                    if (remainder != 0)
                    {
                        errorMessage = "Number fails Check Digit verification.";
                    }
    
                    if (errorMessage == "") // Passed check digit verification. 
                    {
                        return new ValidationResult(true, "This is a valid ISBN.");
                    }// end check digit verification passed
    
                    else // the check digit verification failed
                    {
                        return new ValidationResult(false, errorMessage);
                    }
    
                }// end no group length errors
    
                else // There was some error in a group length
                {
                    return new ValidationResult(false, errorMessage);
                }
    
            }// end RegEx match succeeded
    
            else // There was a RegEx match failure
            {
                  return new ValidationResult(false, errorMessage);
            }
    
        }// end Validate method 
    
    }// end ISBN10ValidationRule class
    

    La classe de règle de validation que vous venez de créer contient toute la logique de validation détaillée. Pour plus d'informations sur les classes de règle de validation, voir System.Text.RegularExpressions et ValidationRule.

Pour créer une classe de champ personnalisé

  1. Ouvrez le fichier ISBN.Field.cs. Un GUID, deux constructeurs requis et une substitution de la propriété FieldRenderingControl ont été fournis. Vous ne devrez modifier ces contrôles que rarement. Par défaut, votre nouvelle classe de champ est déclarée pour hériter de SPFieldText. Dans le cadre de cette procédure pas à pas, ce choix est correct. (Pour plus d'informations sur les autres classes à partir desquelles vous pouvez dériver votre type de champ personnalisé, voir Classes de champs personnalisés.)

  2. Ajoutez les instructions using suivantes à ISBN.Field.cs. Veillez à remplacer "MyCompany" par le nom de votre société :

    using System.Windows.Controls;
    using System.Globalization;
    using MyCompany.SharePoint.WebControls;
    using MyCompany.System.Windows.Controls;
    
  3. Changez l'espace de noms en MyCompany.SharePoint.

  4. Ajoutez la substitution suivante de la méthode GetValidatedString à la classe ISBNField :

    public override string GetValidatedString(object value)
    {
        if ((this.Required == true)
           &&
           ((value == null)
            ||
           ((String)value == "")))
        {
            throw new SPFieldValidationException(this.Title 
                + " must have a value.");
        }
        else
        {
            ISBN10ValidationRule rule = new ISBN10ValidationRule();
            ValidationResult result = rule.Validate(value, CultureInfo.InvariantCulture);
    
            if (!result.IsValid)
            {
                throw new SPFieldValidationException((String)result.ErrorContent);
            }
            else
            {
                return base.GetValidatedString(value);
            }
        }
    }// end GetValidatedString
    

    Cette substitution illustre un modèle commun pour les substitutions de GetValidatedString :

    • Les substitutions de la méthode GetValidatedString vérifient si le champ est obligatoire et, le cas échéant, la méthode substituée lève un exception SPFieldValidationException lorsque la valeur est null ou une String vide. Cette exception est interceptée par les pages Nouvel élément et Modifier l'élément si l'utilisateur essaie d'enregistrer l'élément de liste en cours de création ou de modification. Dans ce cas, la page reste ouverte et la propriété Message de l'exception entraîne l'apparition d'un message d'erreur sous le champ vide.

    • Les substitutions de GetValidatedString lèvent une SPFieldValidationException lorsque la valeur n'est pas valide, entraînant l'apparition d'un message d'erreur sous le champ non valide.

    • Les substitutions de GetValidatedString appellent ensuite le GetValidatedString de base, si la valeur passe la validation personnalisée.

  5. Enregistrez et fermez le fichier.

Pour créer le contrôle de rendu de champ

  1. Ouvrez ISBN.FieldControl.cs. Un GUID est fourni pour le contrôle. Par défaut, votre nouvelle classe de champ est déclarée pour hériter de TextField. Dans le cadre de cette procédure pas à pas, ce choix est correct. (Pour plus d'informations sur les autres classes dont peuvent dériver les contrôles de champ personnalisés, voir Contrôles de rendu des champs.)

  2. Ajoutez la ligne suivante à l'aide de l'instruction :

    using System.Web.UI.WebControls;
    
  3. Changez l'espace de noms en MyCompany.SharePoint.WebControls.

  4. Ajoutez un champ protégé pour un contrôle web Label ASP.NET qui ajoutera le préfixe ISBN avant chaque numéro ISBN qui est rendu en mode Création ou Édition. Il n'est pas nécessaire d'ajouter un champ TextBox protégé pour le numéro ISBN lui-même car le ISBNFieldControl personnalisé hérite de ce champ de TextField.

    protected Label ISBNPrefix;
    
  5. Ajoutez ensuite la substitution suivante de la propriété DefaultTemplateName. La String que vous affectez à cette propriété est l'ID d'un objet RenderingTemplate dans un fichier .ascx que vous créez lors d'une étape ultérieure et déployez dans le dossier C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES. Étant donné que, dans cet exemple, nous ne substituons pas ControlTemplate, Template ou TemplateName, le RenderingTemplate sera appelé comme suit : ControlTemplate retournera Template, qui retournera, à son tour, la propriété Template de tout RenderingTemplate nommé par TemplateName. Enfin, l'accesseur get de TemplateName retournera DefaultTemplateName. Dans un cas plus complexe où, par exemple, vous disposez de modèles distincts pour les modes Création et Édition, vous devez substituer une ou plusieurs des propriétés précédentes ainsi que probablement les propriétés AlternateTemplateName ou DefaultAlternateTemplateName.

    protected override string DefaultTemplateName
    {
        get
        {
            return "ISBNFieldControl";
        }
    }
    
  6. Ajoutez la substitution suivante de la méthode CreateChildControls. La substitution n'effectue aucune fonction si le ISBNField sous-jacent est null. (Il peut être null si le ISBNFieldControl est créé indépendamment de l'accesseur « setter » de la propriété FieldRenderingControl de ISBNField (voir la substitution de FieldRenderingControl dans ISBN.Field.cs.). La méthode n'effectue pas non plus de fonction si le SPControlMode est Display. La raison est que le rendu du champ en mode Display sera traité, comme c'est habituellement le cas, au moyen d'un élément RenderPattern qui est défini dans une définition de champ que vous créez ultérieurement dans cette procédure pas à pas. (Dans d'autres situations, le rendu du mode Display s'effectue à l'aide d'un modèle spécial identifié par la propriété DisplayTemplateName. Il est rare que CreateChildControls effectue quoi que ce soit en mode Display pour un type de champ personnalisé. (Pour plus d'informations sur les différents modes de rendu des champs personnalisés, voir Schémas de rendu de champ personnalisé.)

    protected override void CreateChildControls()
    {
        if (this.Field != null && this.ControlMode != SPControlMode.Display)
        {
    
        }// end if there is a non-null underlying ISBNField and control mode is not Display
    
      //Do nothing if the ISBNField is null or control mode is Display.
    }
    
  7. Ajoutez l'appel suivant à la méthode de base en tant que première ligne de la structure conditionnelle. Un appel de ce type est généralement nécessaire pour garantir que les contrôles enfants hérités sont créés dans le cas où ils sont restitués entièrement ou partiellement par les CreateChildControls de base, au lieu de l'être par un modèle. Par exemple, le modèle « TextField » dans DefaultTemplates.ascx (dans C:\program files\common files\microsoft shared\web server extensions\12\template\controltemplates) restitue la TextBox enfant, mais la méthode CreateChildControls règle la taille maximale de la TextBox sur la taille maximale du champ SPFieldText sous-jacent. Les CreateChildControls de base peuvent également créer des contrôles BaseValidator dynamiques. Toutefois, en règle générale, vous n'avez pas accès au code source de la méthode de base, et c'est donc par expérimentation que vous devez déterminer s'il doit être appelé et, le cas échéant, où il doit être appelé dans votre substitution.

    // Make sure inherited child controls are completely rendered.
    base.CreateChildControls();
    
  8. Ajoutez les lignes ci-après pour associer les contrôles enfants du modèle de rendu aux champs de contrôle enfants déclarés dans votre contrôle de champ personnalisé (ou hérités de son parent). Vous devez le faire maintenant, même si vous n'allez pas créer le modèle de rendu avant une étape ultérieure, car l'appel aux CreateChildControls de base associeront les contrôles enfants hérités au modèle de rendu utilisé par le parent de votre classe de champ personnalisé, pas au modèle de rendu personnalisé, ce qui signifie que l'association de base doit être remplacée par une nouvelle.

    // Associate child controls in the .ascx file with the 
    // fields allocated by this control.
    this.ISBNPrefix = (Label)TemplateContainer.FindControl("ISBNPrefix");
    this.textBox = (TextBox)TemplateContainer.FindControl("TextField");
    
  9. Ajoutez la structure suivante sous le code d'association de contrôle. Votre code ne doit rien faire sur une publication, car la réinitialisation sur une publication annulerait toutes les modifications qu'un utilisateur apporterait aux valeurs des contrôles enfants.

        if (!this.Page.IsPostBack)
        {
    
        }// end if this is not a postback 
    
    //Do not reinitialize on a postback.
    
  10. Dans la structure conditionnelle que vous avez ajoutée à l'étape précédente, ajoutez le conditionnel interne suivant pour initialiser le contrôle enfant TextBox avec une valeur ISBN par défaut lorsque le mode de contrôle est New (Création).

    if (this.ControlMode == SPControlMode.New)
    {
        textBox.Text = "0-000-00000-0";
    
    } // end assign default value in New mode
    

    Rien ne doit être fait en mode Édition, car la méthode OnLoaD initialisera ISBNFieldControl.Value à la valeur de ItemFieldValue qui contient la valeur actuelle du champ dans la base de données de contenu. À ce stade, votre substitution de CreateChildControls doit ressembler à ceci.

    protected override void CreateChildControls()
    {
        if (this.Field != null && this.ControlMode != SPControlMode.Display)
        {
            // Make sure inherited child controls are completely rendered.
            base.CreateChildControls();
    
            // Associate child controls in the .ascx file with the 
            // fields allocated by this control.
            this.ISBNPrefix = (Label)TemplateContainer.FindControl("ISBNPrefix");
            this.textBox = (TextBox)TemplateContainer.FindControl("TextField");
    
            if (!this.Page.IsPostBack)
            {
                if (this.ControlMode == SPControlMode.New)
                {
                    textBox.Text = "0-000-00000-0";
    
                } // end assign default value in New mode
    
            }// end if this is not a postback 
    
         //Do not reinitialize on a postback.
    
        }// end if there is a non-null underlying ISBNField and control mode is not Display
    
     // Do nothing if the ISBNField is null or control mode is Display.
    }
    
  11. Ajoutez la substitution suivante de la propriété Value, qui est la propriété du champ dans l'interface utilisateur. Si l'utilisateur final a modifié la valeur sans l'avoir enregistrée, alors la propriété Value n'est pas nécessairement la valeur réelle du ISBNField sous-jacent (dérivé de l'objet SPFieldText) ou de la valeur du champ dans la base de données de contenu. Notez que les accesseurs get et set commencent par appeler EnsureChildControls (qui appellera CreateChildControls si nécessaire). Appeler EnsureChildControls est obligatoire sauf si (1) vous appelez d'abord la propriété de base et (2) vous savez que les accesseurs set et get de la propriété de base appellent EnsureChildControls. Si vous remplaciez le contrôle enfant TextBox sous-jacent hérité de TextField par un contrôle de type entièrement différent, tel qu'une zone de liste déroulante, alors les accesseurs set et get devraient définir ce contrôle directement plutôt que d'appeler la propriété de base. Pour garantir que le contrôle se charge initialement avec la valeur de l'objet ISBNField sous-jacent, la méthode OnLoad définit ISBNFieldControl.Value à la valeur de ItemFieldValue qui est la valeur de l'objet ISBNField sous-jacent.

    public override object Value
    {
        get
        {
            EnsureChildControls();
            return base.Value;
        }
        set
        {
             EnsureChildControls();
             base.Value = (String)value;
             // The value of the ISBNPrefix field is hardcoded in the
             // template, so it is not set here.
        }
    }
    

Pour créer le modèle de rendu

  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet, Type_Champ_ISBN, sélectionnez Ajouter, puis Nouvel élément.

  2. Sélectionnez Éléments de projet Visual C# dans la fenêtre Catégories, puis Fichier de texte dans la fenêtre Modèles.

  3. Dans la zone Nom, tapez ISBNFieldControl.ascx, puis cliquez sur Ajouter. (Ne placez pas le fichier dans un sous-dossier du dossier de projet sans quoi les commandes après génération que vous avez créées précédemment dans cette procédure pas à pas ne le trouveront pas.)

  4. Dans le fichier ISBNFieldControl.ascx qui est créé, ajoutez le texte de balisage suivant :

    <%@ Control Language="C#" %>
    <%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
    <%@ Register TagPrefix="SharePoint" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" Namespace="Microsoft.SharePoint.WebControls" %>
    
    <SharePoint:RenderingTemplate ID="ISBNFieldControl" runat="server">
      <Template>
        <asp:Label ID="ISBNPrefix" Text="ISBN" runat="server" />
        &nbsp;
        <asp:TextBox ID="TextField" runat="server"  />
      </Template>
    </SharePoint:RenderingTemplate>
    

    Notez les faits suivants à propos de ce balisage :

    • L'ID du RenderingTemplate doit être identique à la chaîne que vous avez utilisée dans votre substitution de la propriété DefaultTemplateName.

    • L'attribut Text du contrôle Label est défini ici dans le modèle, car il ne change jamais.

    • Un élément "&nbsp;" HTML s'insère entre deux contrôles.

    • La définition de TextBox est identique à celle du RenderingTemplate « TextField » définie dans C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES\DefaultTemplates.ascx. Mais la définition doit être répétée ici car votre substitution de DefaultTemplateName pointe vers ce modèle personnalisé, et non le modèle « TextField ». Le même ID est utilisé dans le modèle personnalisé car la méthode CreateChildControls de base (voir ci-dessus) peut faire référence au contrôle par l'intermédiaire de cet ID.

  5. Enregistrez le fichier et fermez-le.

Pour créer la définition de type de champ

  1. Dans Visual Studio, générez le projet. Le projet n'est pas terminé, mais vous devez le générer à ce stade pour créer un GUID et un jeton de clé publique pour l'assembly.

  2. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet, Type_Champ_ISBN, sélectionnez Ajouter, puis Nouvel élément.

  3. Sélectionnez Éléments de projet Visual C# dans la fenêtre Catégories, puis Fichier XML dans la fenêtre Modèles.

  4. Dans la zone Nom, tapez fldtypes_ISBNField.xml, puis cliquez sur Ajouter. (Le nom de fichier doit commencer par « fldtypes ». En outre, il ne doit pas être placé dans un sous-dossier du dossier de projet sans quoi les commandes après génération que vous avez créées précédemment dans cette procédure pas à pas ne le trouveront pas.)

  5. Dans le fichier fldtypes_ISBNField.xml qui est créé, ajoutez le texte de balisage suivant :

    <?xml version="1.0" encoding="utf-8" ?>
    <FieldTypes>
      <FieldType>
        <Field Name="TypeName">ISBN</Field>
        <Field Name="ParentType">Text</Field>
        <Field Name="TypeDisplayName">ISBN</Field>
        <Field Name="TypeShortDescription">ISBN for a book</Field>
        <Field Name="UserCreatable">TRUE</Field>
        <Field Name="ShowOnListCreate">TRUE</Field>
        <Field Name="ShowOnSurveyCreate">TRUE</Field>
        <Field Name="ShowOnDocumentLibraryCreate">TRUE</Field>
        <Field Name="ShowOnColumnTemplateCreate">TRUE</Field>
        <Field Name="FieldTypeClass">MyCompany.SharePoint.ISBNField, MyCompany.SharePoint.ISBN_Field_Type, Version=1.0.0.0, Culture=neutral, PublicKeyToken=token</Field>
    
      </FieldType>
    </FieldTypes>
    

    Ce fichier définit le type de champ personnalisé pour Windows SharePoint Services 3.0. Pour plus d'informations sur la fonction et la signification de ses éléments, voir Définition de type de champ personnalisé, FieldTypes, élément (Types de champs), FieldType, élément (types de champ) et Field, élément (types de champs). Notez que l'élément <Field Name="FieldTypeClass"> doit tenir entièrement sur une seule ligne.

  6. Dans l'élément <Field Name="FieldTypeClass">, remplacez MyCompany par le nom de votre société dans le nom de classe complet et dans le nom de l'assembly. Remplacez également token par le jeton de clé publique de votre assembly. Pour obtenir le jeton de clé publique, sélectionnez Obtenir la clé publique de l'assembly dans le menu Outils. Le jeton de clé publique apparaîtra dans la fenêtre Sortie.

  7. Ajoutez maintenant le texte de balisage suivant dans le fichier, juste au-dessous du dernier élément Field et mis en retrait au même niveau que les différents éléments Field :

    <RenderPattern Name="DisplayPattern">
      <Switch>
        <Expr>
          <Column/>
        </Expr>
        <Case Value="">
        </Case>
        <Default>
          <HTML><![CDATA[ISBN&nbsp;]]></HTML>
          <Column HTMLEncode="TRUE"/>
        </Default>
      </Switch>
    </RenderPattern>
    

    Cet élément RenderPattern du type DisplayPattern restitue le champ dans les affichages Liste et en mode d'affichage. Si la valeur du champ (représentée par l'élément Column) est une chaîne vide, il n'effectue aucune fonction. Si le champ a une valeur, le mot « ISBN » est restitué, suivi d'un espace et de la valeur du champ. L'en-tête de colonne en mode d'affichage Liste est rendue par un type HeaderPattern de RenderPattern dont le type de champ personnalisé héritera de son type de champ « Texte » parent. (Pour plus d'informations sur les modèles de rendu, voir RenderPattern, élément (Types de champs)).

Bb861799.Caution(fr-fr,office.12).gif Attention :

N'utilisez pas l'option Déploiement dans le menu Générer de Visual Studio, si vous travaillez avec la version 1.0 des outils Windows SharePoint Services 3.0 : Extensions Visual Studio 2005. Cela entraînerait le déploiement d'un fichier fldtypes*.xml simplifié à la place de celui que vous avez créé. La version simplifiée ne contiendra pas le modèle RenderPattern personnalisé.

Pour générer et tester le type de champ personnalisé

  1. Sélectionnez Régénérer dans le menu Générer. En raison des commandes post-génération que vous avez créées précédemment, les différents fichiers seront copiés automatiquement aux endroits voulus.

  2. Ouvrez un site Web dans votre application Web SharePoint et créez une liste intitulée Livres.

  3. Ajouter une nouvelle colonne à la liste. Dans la page Créer une colonne, entrez « ISBN » comme nom de colonne.

  4. Cliquez sur la case d'option ISBN pour un livre.

  5. Cliquez sur la case d'option Oui pour rendre le champ obligatoire.

  6. Laissez la case à cocher Ajouter à l'affichage par défaut activée.

  7. Cliquez sur OK.

  8. Ajoutez un élément à la liste.

  9. Dans la page Nouvel élément, vérifiez que le champ est initialement défini sur la valeur par défaut "0-000-00000-0".

  10. Entrez des valeurs ISBN non valides pour vérifier quels types d'erreurs vous obtenez lorsque vous essayez d'enregistrer l'élément.

  11. Vérifiez ce qui se passe si vous laissez le champ entièrement vide.

  12. Enfin, entrez 0-262-61108-2 ou une autre valeur que vous savez valide et cliquez sur OK. (Si vous obtenez des erreurs indiquant un ISBN non valide, vérifiez que vous n'avez pas laissé d'espace vide à la fin de la valeur.)

  13. Vérifiez que la valeur dans la vue de liste est précédée d'un « ISBN » et d'un espace.

  14. Cliquez sur le titre de l'élément pour ouvrir la page d'affichage. Vérifiez que le champ est rendu de la même façon qu'en mode Liste.

  15. Cliquez sur Modifier l'élément pour modifier le champ. Vérifiez que le champ est initialement défini à sa valeur courante, et non à sa valeur par défaut.

  16. Modifiez le champ en y indiquant des valeurs non valides et vérifiez que des erreurs de validation apparaissent en mode Édition exactement comme en mode Création.

Dans Windows SharePoint Services 3.0, le rendu de champ avec contrôles de rendu de champ personnalisés pour les périphériques mobiles est similaire au rendu de champ avec contrôles de rendu de champ personnalisés pour les ordinateurs. Mais gardez ces différences à l'esprit :

  • Les pages mobiles constituent un ensemble de pages totalement distinct des pages principales d'un site Windows SharePoint Services (qui sont conçues pour les navigateurs d'ordinateur) et font référence à un ensemble différent d'objets RenderingTemplate.

  • Les objets RenderingTemplate mobiles sont déclarés dans MobileDefaultTemplates.ascx, pas dans DefaultTemplates.ascx.

  • Les contrôles de rendu de champ mobiles possèdent leur propre espace de noms, Microsoft.SharePoint.MobileControls et dérivent de classes de l'espace de noms System.Web.UI.MobileControls ASP.NET (plutôt que de l'espace de noms System.Web.UI.WebControls).

  • Pour les contrôles de rendu de champ mobiles, la hiérarchie d'héritage est un peu différente de celle des contrôles de rendu de champ normaux. Par exemple, les fonctions de TemplateBasedControl et de FormComponent dans le rendu de champ normal sont combinées dans la classe SPMobileComponent.

  • Les contrôles de rendu de champ personnalisés que vous créez pour des contextes mobiles reposent plus sur la méthode CreateChildControls du contrôle pour restituer un champ, et moins sur le modèle de rendu, que dans le cas des contrôles de rendu de champ personnalisés que vous créez pour les navigateurs d'ordinateur. En outre, en développant des contrôles de rendu mobiles personnalisés, vous ne substituerez pas souvent la méthode CreateChildControls à proprement parler. À la place, vos contrôles de rendu mobiles personnalisés substitueront généralement une ou plusieurs des quatre méthodes qui sont appelées par la méthode CreateChildControls  :

Lorsque votre type de champ personnalisé a été soigneusement testé, ajoutez une solution Windows SharePoint Services 3.0 au projet Visual Studio pour pouvoir le déployer facilement sur les serveurs de production. Pour plus d'informations, voir Vue d'ensemble des solutions.

Afficher: