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 otros tipos de plantilla de formulario. Por ejemplo, para agregar un controlador de eventos OnLoad, con la plantilla de formulario abierta en el diseñador de InfoPath, haga clic en Evento Al cargar (OnLoad) en la ficha Programador. En el editor de código de Microsoft Visual Studio Tools for Applications, el foco se desplazará automáticamente al código del formulario relacionado con el controlador de eventos OnLoad.

En los proyectos de plantillas de formulario con código administrado compatibles con InfoPath 2003, 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 da por supuesto que el usuario tiene abierto un proyecto de plantilla de formulario en Microsoft InfoPath 2010 con Microsoft Visual Studio Tools for Applications.

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

  1. En el panel Controles , haga clic en Botón para agregar un botón al formulario.

  2. En la ficha Propiedades, haga clic en Código personalizado.

    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, a continuación, haga clic en uno de los comandos, como por ejemplo Evento Al validar (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.

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 la ficha Datos, 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. Haga clic en la pestaña Archivo y, a continuación, en Opciones de formulario.

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

    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. Haga clic en la pestaña Archivo y, a continuación, en Opciones de formulario.

  2. En la categoría Control de versiones, seleccione Utilizar evento personalizado en la lista Actualizar formularios existentes, haga clic en Editar y a continuación haga clic en Aceptar.

    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. Haga clic en la pestaña Archivo y, a continuación, en Opciones de formulario.

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

    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'.

[InfoPathEventHandler(MatchPath="/invoice/total", EventType=InfoPathEventType.OnValidate)]
public void total_OnValidate(DataDOMEvent e)
{
    // Write your code here.
}
<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é de 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:

thisXDocument.UI.Alert.(e.Site.text);
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