다음을 통해 공유


방법: InfoPath 2003 개체 모델을 사용하여 이벤트 처리기 추가

InfoPath 2003 개체 모델과 호환되는 양식 서식 파일 프로젝트에 이벤트 처리기 함수를 추가하는 메뉴 명령은 기본적으로 다른 유형의 양식 서식 파일을 사용하는 명령과 같습니다. 예를 들어 OnLoad 이벤트 처리기를 추가하려면 InfoPath 디자이너에서 양식 서식 파일을 열고 개발자 탭에서 On Load 이벤트 명령을 클릭합니다. 포커스가 Microsoft Visual Studio Tools for Applications 코드 편집기에 있는 OnLoad 이벤트 처리기의 양식 코드로 자동으로 전환됩니다.

InfoPath 2003과 호환되는 관리 코드 양식 서식 파일 프로젝트에서 이벤트 처리기 함수가 있는 클래스와 이벤트 처리기 자체는 코드 모듈의 InfoPath 고유 특성에 의해 식별됩니다.

다음 모든 절차에서는 Microsoft Visual Studio Tools for Applications가 설치된 Microsoft InfoPath 2010에서 양식 서식 파일 프로젝트를 열었다고 가정합니다.

명령 단추의 OnClick 이벤트에 대한 이벤트 처리기 추가

  1. 컨트롤 창에서 단추를 클릭하여 양식에 단추를 추가합니다.

  2. 속성 탭에서 사용자 지정 코드를 클릭합니다.

    포커스가 코드 편집기에서 OnClick 이벤트에 대한 이벤트 처리기 스텁으로 전환됩니다.

필드나 그룹의 OnBeforeChange, OnValidate 또는 OnAfterChange 이벤트에 대한 이벤트 처리기 추가

  1. 텍스트 상자 컨트롤과 같이 필드나 그룹에 바인딩된 데이터 입력 컨트롤을 마우스 오른쪽 단추로 클릭합니다.

  2. 프로그래밍을 가리킨 후 On Validate 이벤트와 같은 명령 중 하나를 클릭합니다.

    포커스가 코드 편집기에서 OnBeforeChange, OnValidate 또는 OnAfterChange 이벤트 중 하나에 대한 이벤트 처리기 스텁으로 전환됩니다.

양식의 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 이벤트 처리기에서 해시 테이블을 업데이트합니다. InfoPathEventHandlerAttribute 클래스로 구현되는 InfoPathEventHandler 특성의 DataObject 속성을 사용하여 보조 데이터 원본이 참조됩니다.

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 2003 관리 코드 개체 모델과 호환되는 새 InfoPath 양식 서식 파일 프로젝트를 만드는 경우, 양식 서식 파일의 모든 이벤트 처리기가 포함된 클래스를 식별하기 위해 양식 코드 모듈의 시작 부분에 있는 클래스에 어셈블리 수준의 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 디자인 모드 사용자 인터페이스에서 메뉴 명령이나 단추를 사용하여 새 이벤트 처리기를 추가하면 이벤트 처리기 함수의 스텁이 양식에 기록됩니다. 다음 예제에서는 이름이 'total'인 필드에 대해 추가된 OnValidate용으로 만든 스텁 이벤트 처리기를 보여 줍니다.

[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

그런 다음 thisXDocument 또는 thisApplication 변수의 캐시된 Private 멤버를 사용하거나 이벤트 처리기에 수신된 e EventArgs 개체에서 액세스되는 멤버를 사용하여 InfoPath 개체 모델 멤버를 호출하는 코드를 추가할 수 있습니다.

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

InfoPathEventHandlerAttribute 클래스에서 정의한 대로 InfoPathEventHandler 특성은 이벤트 처리기로 사용될 함수의 사용자 지정 특성입니다.

이벤트에 필요할 경우 InfoPathEventHandlerAttribute 클래스의 MatchPath 속성에서 정의한 대로 MatchPath 매개 변수가 이벤트 원본을 식별하는 XPath 식을 지정합니다. InfoPathEventHandlerAttribute 클래스의 EventType 속성에서 정의한 대로 EventType 매개 변수는 이벤트 유형을 지정합니다. 이러한 매개 변수의 값을 변경하면 안 됩니다. 변경할 경우 이벤트 처리기가 제대로 컴파일하지 못하거나 이벤트 알림이 제대로 발생하지 않습니다.

이벤트 처리기의 코드 난독 처리

관리 코드 양식 서식 파일을 컴파일할 때 생성되는 어셈블리(projectname.dll)에서 obfuscator 유틸리티를 실행하면 사용자가 양식을 열 때 어셈블리가 로드되지 않습니다. 이벤트 처리기의 코드나 기타 양식 코드를 난독 처리하려면 해당 코드를 다른 어셈블리에 넣고 이 어셈블리를 프로젝트에서 참조한 다음, FormCode.cs 또는 FormCode.vb에서 참조하는 어셈블리의 멤버를 호출해야 합니다. obfuscator 유틸리티는 반드시 참조하는 어셈블리에서만 실행해야 합니다.

참고 항목

개념

방법: InfoPath 2003 개체 모델을 사용하여 양식 이벤트에 응답