Поделиться через


Практическое руководство. Добавление обработчика событий с помощью объектной модели InfoPath 2003

Команды меню для добавления функций обработчика событий в проекте шаблона формы, совместимом с объектной моделью InfoPath 2003, аналогичны командам для использования сценария. Например, чтобы добавить обработчик событий OnLoad, в форме, открытой в режиме конструктора InfoPath, выберите пункт Программирование в меню Сервис и щелкните Событие OnLoad. Фокус автоматически переключится на код формы для обработчика событий OnLoad в Набор средств Microsoft Visual Studio для приложений (VSTA) или в редакторе кода Microsoft Visual Studio.

В проектах шаблонов форм с управляемым кодом класс, содержащий функции обработчиков событий и собственно обработчики событий, идентифицируется по относящимся к InfoPath атрибутам в модуле кода.

Во всех следующих процедурах предполагается наличие проекта шаблона формы, открытого в одном из следующих приложений: Microsoft Office InfoPath 2007 с Набор средств Microsoft Visual Studio для приложений (VSTA), Visual Studio 2005 с Набор средств Microsoft Visual Studio 2005 для Microsoft Office System 2007 или Visual Studio 2008 с Visual Studio Tools для Office.

Добавление обработчика событий "OnClick" для кнопки

  1. Чтобы добавить кнопку в форму, в области задач Элементы управления или на Панели элементов в Visual Studio щелкните элемент Кнопка.

  2. Дважды щелкните кнопку и выберите Редактировать код формы.

    Фокус переключится на заглушку обработчика событий для события OnClick в редакторе кода.

Добавление обработчика событий "OnBeforeChange", "OnValidate" или "OnAfterChange" для поля или группы

  1. Щелкните правой кнопкой мыши элемент управления ввода данных, связанный с полем или группой, например элемент управления Текстовое поле.

  2. Наведите указатель на пункт Программирование и щелкните Событие OnValidate.

    Фокус переключится на заглушку обработчика событий для одного из следующих событий в редакторе кода: OnBeforeChange, OnValidate или OnAfterChange.

    ЗаметкаЗаметка

    Если при работе в Visual Studio производится добавление обработчика событий к полю или группе и затем изменяется схема источника данных в области задач InfoPath Источник данных таким образом, что эта операция влияет на поле или группу (например, путем переименования или перемещения), то при переключении обратно в Visual Studio отобразится следующее сообщение: "В схему шаблона формы внесены изменения, для которых может потребоваться обновление выражений XPath в коде формы. Обновить эти выражения автоматически?". Необходимо нажать кнопку Да, чтобы выражение XPath, используемое для связи обработчика событий с полем или группой, автоматически обновилось в соответствии с вносимыми изменениями. Если выбрать вариант Нет, то необходимо самостоятельно обновить выражение XPath в параметре MatchPath атрибута InfoPathEventHandler обработчика событий, чтобы предотвратить сбой обработчика. Дополнительные сведения см. в подразделе "Идентификация обработчиков событий" далее в этом разделе.

    ЗаметкаЗаметка

    Также обратите внимание, что при внесении изменений в схему в области задач InfoPath Источник данных эти изменения автоматически сохраняются, без запроса перезаписывая существующий шаблон формы в момент переключения обратно в Visual Studio.

Добавление обработчика событий "OnLoad", "OnSwitchView", "OnContextChange" или "OnSign" для формы

  • В меню Сервис выберите пункт Программирование и щелкните событие формы, для которого требуется написать обработчик событий.

    Фокус переключится на заглушку обработчика событий для одного из следующих событий в редакторе кода: OnLoad, OnSwitchView, OnContextChange или OnSign.

Добавление обработчика событий "OnSubmitRequest" для формы

  1. В меню Сервис выберите пункт Параметры отправки.

  2. Установите флажок Разрешить пользователям отправлять эту форму и щелкните Выполнить пользовательское действие с использованием кода.

  3. Нажмите кнопку Редактировать код, а затем кнопку ОК.

    Фокус переключится на заглушку обработчика событий OnSubmitRequest в редакторе кода.

Добавление обработчика событий "OnSaveRequest" для формы

  1. В меню Сервис выберите пункт Параметры формы.

  2. В категории Открытие и сохранение последовательно щелкните пункты Сохранить с использованием пользовательского кода и Изменить.

    Фокус переключится на заглушку обработчика событий OnSaveRequest в редакторе кода.

Добавление обработчика событий "OnVersionUpgrade" для формы

  1. В меню Сервис щелкните Параметры формы.

  2. В категории Программирование выберите Использовать специальное событие из списка При обновлении версии и щелкните Изменить.

    Фокус переключится на заглушку обработчика событий OnVersionUpgrade в редакторе кода.

Добавление обработчика событий "OnMergeRequest" для формы

  1. В меню Сервис щелкните Параметры формы.

  2. В категории Дополнительно установите флажки Разрешить объединение форм и Объединить с использованием пользовательского кода и щелкните Изменить.

    Фокус переключится на заглушку обработчика событий OnMergeRequest в редакторе кода.

Добавление обработчика событий "OnAfterImport"

Чтобы добавить обработчики событий OnAfterImport, необходимо открыть код формы для шаблона формы с управляемым кодом и вручную добавить функцию обработчика событий. Для получения сведений о способах написания обработчика для этого события щелкните ссылку для события OnAfterImport.

Добавление обработчика событий для дополнительного источника данных

Способы добавления обработчика событий для дополнительного источника данных продемонстрированы в приведенном далее примере. В этом примере предполагается наличие дополнительного источника данных из файла ресурсов books.xml, использующего следующую схему:

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

Представление формы строится на основе этого источника данных. Код формы создает хэш-таблицу, включающую список авторов и количество написанных ими книг. Можно обновить записи таблицы, отображаемой в представлении, после чего обработчик событий OnAfterChange обновит хэш-таблицу. Обратите внимание, что для добавления ссылки на дополнительный источник данных используется свойство DataObject атрибута InfoPathEventHandler (реализованного классом InfoPathEventHandlerAttribute).

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

Идентификация класса, содержащего обработчики событий

При создании нового проекта шаблона формы InfoPath, совместимого с объектной моделью управляемого кода InfoPath 2003, к классу, расположенному в начале модуля кода формы, добавляется атрибут уровня сборки System.ComponentModel.Description, позволяющий идентифицировать класс, содержащий все обработчики событий для шаблона формы.

ЗаметкаВнимание!

Не изменяйте атрибут System.ComponentModel.Description в этом классе. При его изменении шаблон формы не сможет идентифицировать расположение обработчиков событий, и обработчики событий не запустятся.

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

Идентификация обработчиков событий

Когда новый обработчик событий добавляется с помощью команд меню или кнопок пользовательского интерфейса в режиме конструктора InfoPath, в форму записывается заглушка для функции обработчика событий. В следующем примере продемонстрировано добавление заглушки обработчика событий, созданной для события OnValidate, для поля "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

Затем можно добавить код, вызывающий члены объектной модели InfoPath с помощью закрытых кэшированных переменных-членов классов thisXDocument или thisApplication либо посредством членов, доступных из объекта e EventArgs, полученного обработчиком событий.

[C#]

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

[Visual Basic]

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

Атрибут InfoPathEventHandler (в соответствии с определением класса InfoPathEventHandlerAttribute) является пользовательским атрибутом для функций, которые будут использоваться в качестве обработчиков событий.

Если это требуется для события, параметр MatchPath (в соответствии с определением свойства MatchPath класса InfoPathEventHandlerAttribute) указывает выражение XPath, которое идентифицирует источник события. Параметр EventType (в соответствии с определением свойства EventType класса InfoPathEventHandlerAttribute) указывает тип события. Не следует менять значения этих параметров. Изменение этих значений может привести к неправильной компиляции обработчика событий или к отсутствию ожидаемого уведомления о событии.

Скрытие кода в обработчиках событий

Если запустить средство скрытия кода для сборки, созданной при компиляции шаблона формы с управляемым кодом (имя_проекта.dll), приложению InfoPath не удастся загрузить сборку при открытии формы пользователем. Если требуется скрыть код обработчиков событий или другой код формы, следует поместить код, который требуется скрыть, в отдельную сборку и указать в проекте ссылку на эту сборку, а затем вызвать элементы связанной сборки из файла FormCode.cs или FormCode.vb. Очень важно запускать средство скрытия кода только для отдельной сборки, связанной с проектом посредством ссылки.

См. также

Концепции

Практическое руководство. Обработка событий форм с помощью объектной модели InfoPath 2003