Share via


Cómo: Agregar un controlador de eventos mediante el modelo de objetos de InfoPath 2003

Los comandos de menú para agregar funciones de controlador de eventos a un proyecto de plantilla de formulario compatible con el modelo de objetos de InfoPath 2003 son fundamentalmente los mismos que los utilizados en las secuencias de comandos. Por ejemplo, para agregar un controlador de eventos OnLoad, con el formulario abierto en el modo de diseño de InfoPath, seleccione Programación en el menú Herramientas y, a continuación, haga clic en Evento On Load. En el editor de código de OnLoad o Microsoft Visual Studio 2005, el foco se desplazará automáticamente a la parte del código del formulario relacionada con el controlador de eventos Microsoft Visual Studio Tools para aplicaciones (VSTA).

En los proyectos de plantillas de formulario con código administrado, la clase que contiene funciones de controlador de eventos y los propios controladores de eventos se identifican mediante atributos específicos de InfoPath en el módulo de código.

En todos los procedimientos siguientes se asume que el usuario tiene abierta un proyecto de plantilla de formulario en Microsoft Office InfoPath 2007 con Microsoft Visual Studio Tools para aplicaciones (VSTA), en Visual Studio 2005 con Microsoft Visual Studio 2005 Tools para 2007 Microsoft Office System o en Visual Studio 2008 con Visual Studio Tools para Office.

Agregar un controlador de eventos para el evento OnClick de un botón de comando

  1. En el panel de tareas Controles o en el Cuadro de herramientas de Visual Studio, haga clic en Botón para agregar un botón al formulario.

  2. Haga doble clic en el botón y, a continuación, haga clic en Modificar código del formulario.

    Se desplazará el foco al código auxiliar del controlador de eventos del evento OnClick en el editor de código.

Agregar un controlador de eventos para el evento OnBeforeChange, OnValidate u OnAfterChange de un campo o un grupo

  1. Haga clic con el botón secundario en un control de entrada de datos enlazado al campo o grupo, como un control de Cuadro de texto.

  2. Seleccione Programación y, continuación, haga clic en Evento OnValidate.

    El foco se desplazará al código auxiliar del controlador de eventos de uno de los eventos siguientes en el editor de código: OnBeforeChange, OnValidate o OnAfterChange.

    Nota

    Si está trabajando en Visual Studio, y agrega un controlador de eventos a un campo o grupo y, después, modifica el esquema del origen de datos en el panel de tareas Origen de datos de InfoPath de una forma que afecte a ese campo o grupo (por ejemplo, cambiando su nombre o moviéndolo), aparecerá el siguiente mensaje cuando regrese a Visual Studio: "Ha realizado cambios en el esquema de la plantilla de formulario que pueden requerir la actualización de las expresiones XPath del código del formulario. ¿Desea que se actualicen estas expresiones automáticamente?". Responda siempre haciendo clic en para que la expresión XPath utilizada para asociar el controlador de eventos al campo o grupo se actualice automáticamente para reflejar los cambios. Si elige No, deberá actualizar la expresión XPath del parámetro MatchPath del atributo InfoPathEventHandler del controlador de eventos para evitar que se produzca un error en éste. Para obtener más información, vea "Cómo identificar controladores de eventos" de este tema.

    Nota

    Tenga en cuenta también que, si modifica el esquema en el panel de tareas Origen de datos en InfoPath, la modificación se guardará automáticamente, sobrescribiendo la plantilla de formulario existente sin preguntarle nada al volver a Visual Studio.

Agregar un controlador de eventos para el evento OnLoad, OnSwitchView, OnContextChange u OnSign de un formulario

  • En el menú Herramientas, seleccione Programación y haga clic en el evento de formularios para el que desee escribir un controlador de eventos.

    El foco se desplazará al código auxiliar del controlador de eventos de uno de los siguientes en el editor de código: OnLoad, OnSwitchView, OnContextChange o OnSign.

Agregar un controlador de eventos para el evento OnSubmitRequest de un formulario

  1. En el menú Herramientas, haga clic en Opciones de envío.

  2. Active la casilla Permitir que los usuarios envíen este formulario y haga clic en Realizar acción personalizada mediante el código.

  3. Haga clic en Modificar código y después en Aceptar.

    El foco se desplazará al código auxiliar del controlador de eventos del evento OnSubmitRequest en el editor de código.

Agregar un controlador de eventos para el evento OnSaveRequest de un formulario

  1. En el menú Herramientas, haga clic en Opciones de formulario.

  2. En la categoría Abrir y guardar, haga clic en Guardar usando código personalizado y después haga clic en Editar.

    El foco se desplazará al código auxiliar del controlador de eventos del evento OnSaveRequest en el editor de código.

Agregar un controlador de eventos para el evento OnVersionUpgrade de un formulario

  1. En el menú Herramientas, haga clic en Opciones de formulario.

  2. En la categoría Programación, seleccione Utilizar evento personalizado en la lista Al actualizar la versión y haga clic en Editar.

    El foco se desplazará al código auxiliar del controlador de eventos del evento OnVersionUpgrade del editor de código.

Agregar un controlador de eventos para el evento OnMergeRequest de un formulario

  1. En el menú Herramientas, haga clic en Opciones de formulario.

  2. En la categoría Avanzadas, active las casillas Activar combinación de formularios y Combinar usando código personalizado y haga clic en Editar.

    El foco se desplazará al código auxiliar del controlador de eventos del eventoOnMergeRequest en el editor de código.

Agregar un controlador de eventos para el evento OnAfterImport

Para agregar controladores de eventos para el evento OnAfterImport, debe abrir el código de formulario de la plantilla de formulario con código administrado y agregar la función de controlador de eventos manualmente. Para obtener información acerca de cómo escribir un controlador de eventos para este evento, haga clic en el vínculo del evento OnAfterImport.

Agregar un controlador de eventos para un origen de datos secundario

En el ejemplo siguiente se muestra cómo agregar un controlador de eventos para un origen de datos secundario. En el ejemplo se supone que existe un origen de datos secundario procedente de un archivo de recursos llamado books.xml, que tiene el siguiente esquema:

<?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 vista del formulario se genera a partir de este origen de datos. El código de formulario crea una tabla hash basándose en los autores y en el número de libros que han escrito. Si actualiza una de las entradas de la tabla que aparece en la vista, el controlador de eventos OnAfterChange actualizará la tabla hash. Tenga en cuenta que la propiedad DataObject del atributo InfoPathEventHandler (implementada por la clase InfoPathEventHandlerAttribute) se utiliza para establecer una referencia al origen de datos secundario.

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

Cómo se identifica la clase que contiene controladores de eventos

Al crear un proyecto nuevo de plantillas de formulario de InfoPath compatible con el modelo de objetos de código administrado DE InfoPath 2003, se aplica un atributo de nivel de ensamblado System.ComponentModel.Description, a la clase que aparece al principio del módulo de código de formulario, para identificar la clase que contiene todos los controladores de eventos de plantilla de formulario.

Importante

No modifique el atributo System.ComponentModel.Description de esta clase. Si lo hiciera, la plantilla de formulario no podrá identificar dónde se encuentran los controladores de eventos y éstos no podrán ejecutarse.

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

Cómo se identifican los controladores de eventos

Al agregar un nuevo controlador de eventos utilizando comandos de menú o botones en la interfaz de usuario del modo de diseño de InfoPath, el código auxiliar de la función de controlador de eventos se escribe en el formulario. En el ejemplo siguiente se muestra el controlador de eventos de código auxiliar creado para un eventoOnValidate agregado para un campo denominado '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

A continuación, podrá agregar el código que invoca a los miembros del modelo de objetos de InfoPath utilizando los miembros privados almacenados en la memoria caché des las variables thisXDocument o thisApplication, o usando los miembros a los que se obtiene acceso desde los objetos e EventArgs que recibe el controlador de eventos:

[C#]

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

[Visual Basic]

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

El atributo InfoPathEventHandler (según su definición de la clase InfoPathEventHandlerAttribute) es el atributo personalizado de las funciones que se utilizarán como controladores de eventos.

Cuando el evento lo requiera, el parámetro MatchPath (tal como lo define la propiedad MatchPath de la clase InfoPathEventHandlerAttribute) especifica una expresión XPath que identifica el origen del evento. El parámetro EventType (tal como lo define la propiedad EventType de la clase InfoPathEventHandlerAttribute) especifica el tipo de evento. No debe cambiar los valores de estos parámetros. Si lo hace, es posible que el controlador de eventos no se compile correctamente o que la notificación del evento no se produzca como se esperaba.

Proteger el código de los controladores de eventos

Si ejecuta una utilidad de protección en el ensamblado que se genera al compilar una plantilla de formulario con código administrado (nombreproyecto.dll), InfoPath no podrá cargar el ensamblado cuando un usuario abra el formulario. Si desea proteger el código de los controladores de eventos u otro código de formulario, colóquelo en otro ensamblado, incluya una referencia a ese ensamblado en el proyecto y después llame a los miembros del ensamblado de la referencia desde FormCode.cs o FormCode.vb. Es importante que sólo ejecute la utilidad de protección en el ensamblado de la referencia.

Vea también

Conceptos

Cómo: Responder a eventos de formulario con el modelo de objetos de InfoPath 2003