Freigeben über


Vorgehensweise: Hinzufügen eines Ereignishandlers mit dem InfoPath 2003-Objektmodell

Die Menübefehle zum Hinzufügen von Ereignishandlerfunktionen in einem Formularvorlagenprojekt, das mit dem InfoPath 2003-Objektmodell kompatibel ist, sind im Prinzip mit den Befehlen für die Verwendung von Skripts identisch. Um beispielsweise einen OnLoad-Ereignishandler hinzuzufügen, zeigen Sie bei geöffnetem Formular im InfoPath-Entwurfsmodus im Menü Extras auf Programmierung, und klicken Sie dann auf OnLoad-Ereignis. Der Fokus wechselt automatisch zum Formularcode für den OnLoad-Ereignishandler im Code-Editor für Microsoft Visual Studio Tools für Anwendungen (VSTA) oder Microsoft Visual Studio.

In Projekten, die auf Formularvorlagen mit verwaltetem Code basieren, wird die Klasse mit Ereignishandlerfunktionen sowie die Ereignishandler selbst durch InfoPath-spezifische Attribute im Codemodul identifiziert.

Für alle folgenden Verfahren wird davon ausgegangen, dass ein Formularvorlagenprojekt in Microsoft Office InfoPath 2007 mit Microsoft Visual Studio Tools für Anwendungen (VSTA), in Visual Studio 2005 mit Microsoft Visual Studio 2005 Tools für 2007 Microsoft Office System oder in Visual Studio 2008 mit Visual Studio Tools für Office geöffnet ist.

Hinzufügen eines Ereignishandlers für das OnClick-Ereignis einer Befehlsschaltfläche

  1. Klicken Sie im Aufgabenbereich Steuerelemente oder in der Visual Studio-Toolbox auf Schaltfläche, um dem Formular eine Schaltfläche hinzuzufügen.

  2. Doppelklicken Sie auf die Schaltfläche, und klicken Sie dann auf Formularcode bearbeiten.

    Der Fokus wechselt zum Stub für den Ereignishandler für das OnClick-Ereignis im Code-Editor.

Hinzufügen eines Ereignishandlers für die Ereignisse "OnBeforeChange", "OnValidate" oder "OnAfterChange" eines Feldes oder einer Gruppe

  1. Klicken Sie mit der rechten Maustaste auf ein an das Feld oder die Gruppe gebundenes Dateneingabe-Steuerelement, wie z. B. ein Steuerelement vom Typ Textfeld.

  2. Zeigen Sie auf Programmierung, und klicken Sie dann auf On Validate-Ereignis.

    Der Fokus wechselt zum Stub für den Ereignishandler für eins der folgenden Ereignisse im Code-Editor: OnBeforeChange, OnValidate oder OnAfterChange.

    Hinweis

    Wenn Sie in Visual Studio arbeiten und einem Feld oder einer Gruppe einen Ereignishandler hinzufügen und später das Schema der Datenquelle im Aufgabenbereich Datenquelle in InfoPath so ändern, dass sich die Änderung auf dieses Feld oder diese Gruppe auswirkt (z. B. durch Umbenennen oder Verschieben), wird beim Zurückwechseln zu Visual Studio die folgende Meldung angezeigt: "Es wurden Änderungen am Schema der Formularvorlage vorgenommen, die möglicherweise erfordern, dass die XPath-Ausdrücke im Formularcode angepasst werden. Sollen die Ausdrücke automatisch angepasst werden?" Sie sollten immer auf Ja klicken, damit der XPath-Ausdruck, der für die Zuordnung des Ereignishandlers zum Feld oder zur Gruppe verwendet wird, automatisch aktualisiert wird und so die Änderungen widerspiegelt. Wenn Sie auf Nein klicken, müssen Sie den XPath-Ausdruck im MatchPath-Parameter des InfoPathEventHandler-Attributs des Ereignishandlers selbst aktualisieren, damit beim Ereignishandler kein Fehler erzeugt wird. Weitere Informationen finden Sie nachfolgend in diesem Thema unter "Identifizierung von Ereignishandlern".

    Hinweis

    Wenn Sie in InfoPath Änderungen am Schema im Aufgabenbereich Datenquelle vornehmen, werden diese Änderungen automatisch gespeichert und überschreiben die vorhandene Formularvorlage ohne Bestätigung beim Zurückwechseln zu Visual Studio.

Hinzufügen eines Ereignishandlers für die Ereignisse "OnLoad", "OnSwitchView", "OnContextChange" oder "OnSign" eines Formulars

  • Zeigen Sie im Menü Extras auf Programmierung, und klicken Sie dann auf das Formularereignis, für das ein Ereignishandler hinzugefügt werden soll.

    Der Fokus wechselt zum Stub für den Ereignishandler für eins der folgenden Ereignisse im Code-Editor: OnLoad, OnSwitchView, OnContextChange oder OnSign.

Hinzufügen eines Ereignishandlers für das OnSubmitRequest-Ereignis eines Formulars

  1. Klicken Sie im Menü Extras auf Absendeoptionen.

  2. Aktivieren Sie das Kontrollkästchen Übermitteln dieses Formulars durch Benutzer zulassen, und klicken Sie dann auf Benutzerdefinierte Aktion mithilfe von Code ausführen.

  3. Klicken Sie auf Code bearbeiten und dann auf OK.

    Der Fokus wechselt zum Stub für den Ereignishandler für das OnSubmitRequest-Ereignis im Code-Editor.

Hinzufügen eines Ereignishandlers für das OnSaveRequest-Ereignis eines Formulars

  1. Klicken Sie im Menü Extras auf Formularoptionen.

  2. Klicken Sie in der Kategorie Öffnen und Speichern auf Speichern erfolgt mittels benutzerdefiniertem Code, und klicken Sie dann auf Bearbeiten.

    Der Fokus wechselt zum Stub für den Ereignishandler für das OnSaveRequest-Ereignis im Code-Editor.

Hinzufügen eines Ereignishandlers für das OnVersionUpgrade-Ereignis eines Formulars

  1. Klicken Sie im Menü Extras auf Formularoptionen.

  2. Wählen Sie in der Kategorie Programmierung in der Liste Bei Versionsaktualisierung die Option Benutzerdefiniertes Ereignis verwenden aus, und klicken Sie dann auf Bearbeiten.

    Der Fokus wechselt zum Stub für den Ereignishandler für das OnVersionUpgrade-Ereignis im Code-Editor.

Hinzufügen eines Ereignishandlers für das OnMergeRequest-Ereignis eines Formulars

  1. Klicken Sie im Menü Extras auf Formularoptionen.

  2. Aktivieren Sie in der Kategorie Erweitert die Kontrollkästchen Zusammenführen von Formularen aktivieren und Mithilfe von benutzerdefiniertem Code zusammenführen, und klicken Sie dann auf Bearbeiten.

    Der Fokus wechselt zum Stub für den Ereignishandler für das OnMergeRequest-Ereignis im Code-Editor.

Hinzufügen eines Ereignishandlers für das OnAfterImport-Ereignis

Wenn Sie Ereignishandler für das OnAfterImport-Ereignis hinzufügen möchten, müssen Sie den Formularcode für die Formularvorlage mit verwaltetem Code öffnen und die Ereignishandlerfunktion manuell hinzufügen. Informationen zum Erstellen eines Ereignishandlers für dieses Ereignis finden Sie, wenn Sie auf die Verknüpfung für das OnAfterImport-Ereignis klicken.

Hinzufügen eines Ereignishandlers für eine sekundäre Datenquelle

Im folgenden Beispiel wird gezeigt, wie ein Ereignishandler für eine sekundäre Datenquelle hinzugefügt wird. Bei diesem Beispiel wird von einer sekundären Datenquelle in der Ressourcendatei "books.xml" ausgegangen, die folgendes Schema aufweist:

<?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>

Die Ansicht des Formulars wird aus dieser Datenquelle erstellt. Der Formularcode erstellt eine Hashtabelle, die auf den Autoren und der Anzahl von deren Büchern basiert. Sie können einen Eintrag aus der in der Ansicht gezeigten Tabelle aktualisieren; dann aktualisiert der OnAfterChange-Ereignishandler die Hashtabelle. Beachten Sie, dass über die DataObject-Eigenschaft des InfoPathEventHandler-Attributs (das durch die InfoPathEventHandlerAttribute-Klasse implementiert wird) auf die sekundäre Datenquelle verwiesen wird.

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());
        }
    }
}

Identifizierung der Klasse mit Ereignishandlern

Wenn Sie ein neues InfoPath-Formularvorlagenprojekt erstellen, das mit dem InfoPath 2003-Objektmodell mit verwaltetem Code kompatibel ist, wird ein System.ComponentModel.Description-Attribut auf Assemblyebene am Anfang des Formularcodemoduls auf die Klasse angewendet, um die Klasse zu identifizieren, die alle Ereignishandler für die Formularvorlage enthält.

Wichtig

Ändern Sie das System.ComponentModel.Description-Attribut in dieser Klasse nicht. Bei einer Änderung kann von der Formularvorlage die Position der Ereignishandler nicht identifiziert werden, und die Ereignishandler werden nicht ausgeführt.

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")>

Identifizierung von Ereignishandlern

Wenn Sie einen neuen Ereignishandler über Menübefehle oder Schaltflächen auf der InfoPath-Benutzeroberfläche im Entwurfsmodus hinzufügen, wird der Stub für die Ereignishandlerfunktion in das Formular geschrieben. Das folgende Beispiel zeigt den für OnValidate erstellten Stubereignishandler, der zu einem Feld mit der Bezeichnung "total" hinzugefügt wurde.

[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

Sie können dann Code hinzufügen, der Member des InfoPath-Objektmodells mithilfe der privaten Cachemember der Variablen thisXDocument oder thisApplication oder mithilfe der Member aufruft, auf die über das vom Ereignishandler empfangene e EventArgs-Objekt zugegriffen wird:

[C#]

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

[Visual Basic]

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

Das InfoPathEventHandler-Attribut (gemäß Definition der InfoPathEventHandlerAttribute-Klasse) ist das benutzerdefinierte Attribut für Funktionen, die als Ereignishandler verwendet werden.

Wenn das Ereignis dies erfordert, gibt der MatchPath-Parameter (gemäß Definition der MatchPath-Eigenschaft der InfoPathEventHandlerAttribute-Klasse) einen XPath-Ausdruck an, der die Ereignisquelle identifiziert. Der EventType-Parameter (gemäß Definition der EventType-Eigenschaft der InfoPathEventHandlerAttribute-Klasse) gibt den Ereignistyp an. Die Werte dieser Parameter sollten nicht geändert werden. Wenn die Werte geändert werden, wird die Kompilierung des Ereignishandlers möglicherweise nicht richtig abgeschlossen, oder eine Ereignisbenachrichtigung wird nicht wie erwartet ausgeführt.

Verbergen von Code in Ereignishandlern

Wenn Sie für die Assembly, die beim Kompilieren einer Formularvorlage mit verwaltetem Code generiert wird (Projektname.dll), ein Dienstprogramm zum Verbergen ausführen, kann die Assembly beim Öffnen des Formulars von InfoPath nicht geladen werden. Falls Sie den Code für Ereignishandler oder anderen Formularcode verbergen möchten, müssen Sie den zu verbergenden Code in eine separate Assembly stellen, im Projekt auf diese Assembly verweisen und dann Member der referenzierten Assembly aus "FormCode.cs" oder "FormCode.vb" aufrufen. Es ist wichtig, dass Sie das Dienstprogramm zum Verbergen nur für die referenzierte Assembly ausführen.

Siehe auch

Konzepte

Vorgehensweise: Reagieren auf Formularereignisse mit dem InfoPath 2003-Objektmodell