Partager via


Procédure d'ajout d'un gestionnaire d'événements en utilisant le modèle objet InfoPath 2003

Les commandes de menu qui permettent d'ajouter des fonctions de gestionnaire d'événements dans un projet de modèle de formulaire compatible avec le modèle objet InfoPath 2003 sont quasiment les mêmes que celles qui permettent l'utilisation de scripts. Par exemple, pour ajouter un gestionnaire d'événements OnLoad, ouvrez le formulaire en mode Création dans InfoPath, puis pointez sur Programmation dans le menu Outils, puis cliquez sur Événement Sur chargement (OnLoad). L'affichage bascule automatiquement vers le code de formulaire du gestionnaire d'événements OnLoad dans l'éditeur de code Microsoft Visual Studio Tools for Applications (VSTA) ou Microsoft Visual Studio.

Dans les projets de modèle avec code managé, la classe qui contient les fonctions du gestionnaire d'événements et les gestionnaires d'événements eux-mêmes sont identifiés par des attributs spécifiques à InfoPath dans le module de code.

Toutes les procédures suivantes partent du principe que vous avez ouvert un projet de modèle de formulaire dans Microsoft Office InfoPath 2007 avec Microsoft Visual Studio Tools for Applications (VSTA), Visual Studio 2005 avec Microsoft Visual Studio 2005 Tools pour Microsoft Office System2007 ou Visual Studio 2008 avec Visual Studio Tools pour Office.

Ajout d'un gestionnaire d'événements pour l'événement OnClick d'un bouton de commande

  1. Dans le volet Office Contrôles ou dans la Boîte à outils de Visual Studio, cliquez sur Bouton pour ajouter un bouton au formulaire.

  2. Double-cliquez sur le bouton, puis cliquez sur Modifier le code du formulaire.

    L'affichage bascule vers le stub du gestionnaire d'événements de l'événement OnClick dans l'éditeur de code.

Ajout d'un gestionnaire d'événements pour l'événement OnBeforeChange, OnValidate ou OnAfterChange d'un champ ou d'un groupe

  1. Cliquez avec le bouton droit sur un contrôle d'entrée de données lié au champ ou au groupe, par exemple un contrôle Zone de texte.

  2. Pointez sur Programmation, puis cliquez sur Événement Sur validation (OnValidate).

    L'affichage bascule vers le stub du gestionnaire d'événements de l'un des événements suivants dans l'éditeur de code : OnBeforeChange, OnValidate ou OnAfterChange.

    Notes

    Si vous travaillez dans Visual Studio, que vous ajoutez un gestionnaire d'événements à un champ ou à un groupe, puis que vous modifiez par la suite le schéma de la source de données dans le volet Office Source de données d'InfoPath et que cette modification affecte le champ ou le groupe (par exemple en le renommant ou en le déplaçant), le message suivant s'affiche lorsque vous revenez dans Visual Studio : « Vous avez apporté de nombreuses modifications au schéma du modèle de formulaire. Les expressions XPath du code du formulaire devront peut-être être mises à jour. Souhaitez-vous que ces expressions soient mises à jour automatiquement ? ». Vous devez toujours cliquer sur Oui pour que l'expression XPath utilisée pour associer votre gestionnaire d'événements au champ ou au groupe soit automatiquement mise à jour en fonction des modifications. Si vous cliquez sur Non, vous devez mettre à jour l'expression XPath dans le paramètre MatchPath de l'attribut InfoPathEventHandler de votre gestionnaire d'événements pour empêcher un échec de ce dernier. Pour plus d'informations, voir « Comment sont identifiés les gestionnaires d'événements » plus loin dans cette rubrique.

    Notes

    Notez également que lorsque vous modifiez le schéma dans le volet Office Source de données d'InfoPath, ces modifications sont automatiquement enregistrées et écrasent le modèle de formulaire existant sans vous en avertir lorsque vous revenez dans Visual Studio.

Ajout d'un gestionnaire d'événements pour l'événement OnLoad, OnSwitchView, OnContextChange ou OnSign d'un formulaire

  • Dans le menu Outils, pointez sur Programmation, puis cliquez sur l'événement de formulaire pour lequel vous souhaitez écrire un gestionnaire d'événements.

    L'affichage bascule vers le stub du gestionnaire d'événements de l'un des événements suivants dans l'éditeur de code : OnLoad, OnSwitchView, OnContextChange ou OnSign.

Ajout d'un gestionnaire d'événements pour l'événement OnSubmitRequest d'un formulaire

  1. Dans le menu Outils, cliquez sur Options d'envoi.

  2. Activez la case à cocher Autoriser les utilisateurs à envoyer ce formulaire, puis cliquez sur Effectuer une action personnalisée à l'aide du code.

  3. Cliquez sur Modifier le code, puis sur OK.

    L'affichage bascule vers le stub du gestionnaire d'événements de l'événement OnSubmitRequest dans l'éditeur de code.

Ajout d'un gestionnaire d'événements pour l'événement OnSaveRequest d'un formulaire

  1. Dans le menu Outils, cliquez sur Options de formulaire.

  2. Dans la catégorie Ouvrir et enregistrer, cliquez sur Enregistrer au moyen d'un code personnalisé, puis sur Modifier.

    L'affichage bascule vers le stub du gestionnaire d'événements de l'événement OnSaveRequest dans l'éditeur de code.

Ajout d'un gestionnaire d'événements pour l'événement OnVersionUpgrade d'un formulaire

  1. Dans le menu Outils, cliquez sur Options de formulaire.

  2. Dans la catégorie Programmation, sélectionnez Utiliser un événement personnalisé dans la liste Mise à niveau de la version, puis cliquez sur Modifier.

    L'affichage bascule vers le stub du gestionnaire d'événements de l'événement OnVersionUpgrade dans l'éditeur de code.

Ajout d'un gestionnaire d'événements pour l'événement OnMergeRequest d'un formulaire

  1. Dans le menu Outils, cliquez sur Options de formulaire.

  2. Dans la catégorie Avancé, activez les cases à cocher Activer la fusion de formulaires et Fusionner à l'aide d'un code personnalisé, puis cliquez sur Modifier.

    L'affichage bascule vers le stub du gestionnaire d'événements de l'événement OnMergeRequest dans l'éditeur de code.

Ajout d'un gestionnaire d'événements pour l'événement OnAfterImport

Pour ajouter des gestionnaires d'événements pour l'événement OnAfterImport, vous devez ouvrir le code de formulaire de votre modèle de formulaire avec code géré et ajouter manuellement la fonction de gestionnaire d'événements. Pour plus d'informations sur la création d'un gestionnaire d'événements pour cet événement, cliquez sur le lien correspondant à l'événement OnAfterImport.

Ajout d'un gestionnaire d'événements pour une source de données secondaire

L'exemple qui suit illustre l'ajout d'un gestionnaire d'événements pour une source de données secondaire. Cet exemple part du principe qu'il existe une source de données secondaire basée sur un fichier de ressource, books.xml, qui présente le schéma suivant :

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="catalog">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="book" minOccurs="0" maxOccurs="unbounded"></xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="genre" type="xsd:string"></xsd:element>
    <xsd:element name="author" type="xsd:string"></xsd:element>
    <xsd:element name="book">
        <xsd:complexType>
            <xsd:all>
                <xsd:element ref="author" minOccurs="0" maxOccurs="1"></xsd:element>
                <xsd:element ref="title" minOccurs="0" maxOccurs="1"></xsd:element>
                <xsd:element ref="genre" minOccurs="0" maxOccurs="1"></xsd:element>
                <xsd:element ref="price" minOccurs="0" maxOccurs="1"></xsd:element>
                <xsd:element ref="publish_date" minOccurs="0" maxOccurs="1"></xsd:element>
                <xsd:element ref="description" minOccurs="0" maxOccurs="1"></xsd:element>
            </xsd:all>
            <xsd:attribute ref="id"></xsd:attribute>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="price" type="xsd:string"></xsd:element>
    <xsd:element name="title" type="xsd:string"></xsd:element>
    <xsd:element name="publish_date" type="xsd:string"></xsd:element>
    <xsd:element name="description" type="xsd:string"></xsd:element>
    <xsd:attribute name="id" type="xsd:string"></xsd:attribute>
</xsd:schema>

La vue du formulaire est générée à partir de cette source de données. Le code du formulaire crée une table de hachage basée sur les auteurs et le nombre de livres qu'ils ont écrits. Vous pouvez mettre à jour une entrée depuis la table présentée dans la vue, et le gestionnaire d'événements OnAfterChange met alors à jour la table de hachage. Notez que la propriété DataObject de l'attribut InfoPathEventHandler (implémenté par la classe InfoPathEventHandlerAttribute) est utilisée pour faire référence à la source de données secondaire.

namespace AuxDom
{
    // InfoPathNamespace attribute goes here.
    public class AuxDom
    {
        private XDocument thisXDocument;
        private Application thisApplication;
        private Hashtable authors;

        public void _Startup(Application app, XDocument doc)
        {
            thisXDocument = doc;
            thisApplication = app;

            authors = new Hashtable();
        }

        public void _Shutdown()
        {
            authors.Clear();
        }

        // The following function handler is created by Microsoft
        // Office InfoPath. Do not modify the type or number of
        // arguments. 
        [InfoPathEventHandler(EventType=InfoPathEventType.OnLoad)]
        public void OnLoad(DocReturnEvent e)
        {
            IXMLDOMDocument books = thisXDocument.GetDOM("books");
            DOMNodeList externalAuthors = books.selectNodes("/catalog/book/author");
            foreach (IXMLDOMNode authorNode in externalAuthors)
            {
                AddBookFromAuthor(authorNode.text);
            }
        }

        // The following function handler is created by Microsoft
        // Office InfoPath. Do not modify the type or number of
        // arguments. 
        [InfoPathEventHandler(MatchPath="/catalog/book/author", EventType=InfoPathEventType.OnAfterChange, DataObject="books")]
        public void books__author_OnAfterChange(DataDOMEvent e)
        {
            if (e.IsUndoRedo)
            {
                // An undo or redo operation has occurred and the DOM 
                // is read-only.
                return;
            }
            
            if (e.Source.text != e.NewValue.ToString())
            {
                RemoveBookFromAuthor(e.OldValue.ToString());
                AddBookFromAuthor(e.NewValue.ToString());
            }
        }

        private void AddBookFromAuthor(string authorName)
        {
            if (authors.Contains(authorName))
            {
                authors[authorName] = (int)authors[authorName] + 1;
            }
            else
            {
                authors.Add(authorName, 1);
            }
        }

        private void RemoveBookFromAuthor(string authorName)
        {
            if (authors.Contains(authorName))
            {
                authors[authorName] = (int)authors[authorName] - 1;
            }
            if ((int)authors[authorName] == 0)
            {
                authors.Remove(authorName);
            }
        }

        // The following function handler is created by Microsoft
        // Office InfoPath. Do not modify the type or number of
        // arguments. 
        [InfoPathEventHandler(MatchPath="ShowAuthors", EventType=InfoPathEventType.OnClick)]
        public void ShowAuthors_OnClick(DocActionEvent e)
        {
            // Write your code here.
            StringBuilder report = new StringBuilder();

            foreach (string authorName in authors.Keys)
            {
                report.Append(authorName + ",\t\t\t");
                report.Append(authors[authorName] + "\n");
            }

            thisXDocument.UI.Alert(report.ToString());
        }
    }
}

Comment est identifiée la classe qui contient les gestionnaires d'événements

Lorsque vous créez un nouveau projet de modèle de formulaire InfoPath compatible avec le modèle objet avec code managé InfoPath 2003, un attribut System.ComponentModel.Description de niveau assembly est appliqué à la classe au début du module du code du formulaire pour identifier la classe contenant tous les gestionnaires d'événements du modèle de formulaire.

RemarqueImportant :

Ne modifiez pas l'attribut System.ComponentModel.Description de cette classe. Si vous le modifiez, votre modèle de formulaire ne sera plus en mesure d'identifier l'emplacement des gestionnaires d'événements et ceux-ci ne pourront pas fonctionner.

using System;
using Microsoft.Office.Interop.InfoPath.SemiTrust;

// Office integration attribute. Identifies the startup class for the // form. Do not modify.
[assembly: System.ComponentModel.DescriptionAttribute(    "InfoPathStartupClass, Version=1.0, Class=Template1.FormCode")]

Imports System
Imports Microsoft.Office.Interop.InfoPath.SemiTrust

' Office integration attribute. Identifies the startup class for the form. Do not modify.
<Assembly: System.ComponentModel.DescriptionAttribute( _    "InfoPathStartupClass, Version=1.0, Class=Template1.FormCode")>

Comment sont identifiés les gestionnaires d'événements

Lorsque vous ajoutez un nouveau gestionnaire d'événements à l'aide des commandes ou boutons de menu de l'interface utilisateur du mode Création d'InfoPath, le stub de la fonction du gestionnaire d'événements est écrit dans le formulaire. L'exemple qui suit présente le stub du gestionnaire d'événements créé pour un événement OnValidate ajouté à un champ appelé « total ».

[C#]

[InfoPathEventHandler(MatchPath="/invoice/total", EventType=InfoPathEventType.OnValidate)]
public void total_OnValidate(DataDOMEvent e)
{
    // Write your code here.
}

[Visual Basic]

<InfoPathEventHandler(MatchPath:="/invoice/total",EventType:= OnValidate)> Public Sub total_OnValidate(ByVal e As EventArgs)
    ' Write your code here.

End Sub

Vous pouvez ensuite ajouter du code pour invoquer les membres du modèle objet InfoPath à l'aide des membres cachés privés des variables thisXDocument ou thisApplication, ou à l'aide des membres accessibles via l'objet e EventArgs reçu par le gestionnaire d'événements :

[C#]

thisXDocument.UI.Alert.(e.Site.text);

[Visual Basic]

thisXDocument.UI.Alert.(e.Site.text)

L'attribut InfoPathEventHandler (tel que défini par la classe InfoPathEventHandlerAttribute) est l'attribut personnalisé pour les fonctions qui seront utilisées comme gestionnaires d'événements.

Lorsqu'il est requis par l'événement, le paramètre MatchPath (tel que défini par la propriété MatchPath de la classe InfoPathEventHandlerAttribute) spécifie une expression XPath qui identifie la source de l'événement. Le paramètre EventType (tel que défini par la propriété EventType de la classe InfoPathEventHandlerAttribute) spécifie le type de l'événement. Ne modifiez pas la valeur de ces paramètres. Si leur valeur est modifiée, le gestionnaire d'événements peut ne pas être correctement compilé ou la notification d'événement peut ne pas se produire comme prévu.

Obscurcissement de code dans les gestionnaires d'événements

Si vous lancez un utilitaire d'obscurcissement sur l'assembly généré lors de la compilation d'un modèle de formulaire avec code managé (nomprojet.dll), InfoPath ne peut pas charger l'assembly lorsque l'utilisateur ouvre le formulaire. Si vous voulez obscurcir le code des gestionnaires d'événements ou tout autre code de formulaire, vous devez le placer dans une assembly distincte, puis référencer cette assembly dans votre projet et appeler les membres de l'assembly référencée depuis FormCode.cs ou FormCode.vb. Il est important de lancer l'utilitaire d'obscurcissement uniquement sur l'assembly référencée.

Voir aussi

Concepts

Procédure de réponse aux événements de formulaire en utilisant le modèle objet InfoPath 2003