Procedura: Aggiungere un gestore eventi tramite il modello a oggetti di InfoPath 2003
I comandi di menu che consentono di aggiungere le funzioni dei gestori eventi in un progetto modello di modulo compatibile con il modello a oggetti di InfoPath 2003 sono essenzialmente gli stessi che consentono di utilizzare script. Per aggiungere ad esempio un gestore eventi OnLoad, con il modulo aperto in InfoPath in modalità progettazione scegliere Programmazione dal menu Strumenti e quindi Evento di caricamento. Lo stato attivo passerà automaticamente al codice del modulo relativo al gestore eventi OnLoad nell'editor di codice di Microsoft Visual Studio Tools for Applications (VSTA) o di Microsoft Visual Studio.
Nei progetti dei modelli di modulo con codice gestito, la classe che include le funzioni dei gestori eventi e i gestori eventi stessi è identificata da attributi specifici di InfoPath nel modulo di codice.
Tutte le procedure seguenti presuppongono un progetto modello di modulo aperto in Microsoft Office InfoPath 2007 con Microsoft Visual Studio Tools for Applications (VSTA), Visual Studio 2005 con Microsoft Visual Studio Tools per Microsoft Office System 2007 o Visual Studio 2008 con Visual Studio Tools per Office.
Aggiungere un gestore eventi per l'evento OnClick di un pulsante di comando
Nel riquadro attività Controlli o nella Casella degli strumenti di Visual Studio fare clic su Pulsante per aggiungere un pulsante al modulo.
Fare doppio clic sul pulsante e quindi fare clic su Modifica codice modulo.
Lo stato attivo passerà allo stub del gestore eventi per l'evento OnClick nell'editor di codice.
Aggiungere un gestore eventi per l'evento OnBeforeChange, OnValidate o OnAfterChange di un campo o gruppo
Fare clic con il pulsante destro del mouse su un controllo per l'immissione di dati associato al campo o al gruppo, ad esempio un controllo Casella di testo.
Scegliere Programmazione e quindi Evento OnValidate.
Lo stato attivo passerà allo stub del gestore eventi per uno degli eventi seguenti nell'editor di codice: OnBeforeChange, OnValidate o OnAfterChange.
Nota:
Se si utilizza Visual Studio e si aggiunge un gestore eventi a un campo o a un gruppo e successivamente si modifica lo schema dell'origine dati nel riquadro attività Origine dati di InfoPath in modo tale da causare modifiche al campo o al gruppo (ad esempio, rinominandolo o spostandolo), quando si tornerà in Visual Studio verrà visualizzato un messaggio che informa che sono state apportate modifiche allo schema del modello di modulo che potrebbero richiedere l'aggiornamento delle espressioni XPath nel codice del modulo e in cui viene richiesto se aggiornare automaticamente tali espressioni. In questo caso, fare sempre clic su Sì, in modo che l'espressione XPath utilizzata per associare il gestore eventi al campo o al gruppo venga aggiornata automaticamente in base alle modifiche apportate. Se si fa clic su No, sarà necessario aggiornare l'espressione XPath nel parametro MatchPath dell'attributo InfoPathEventHandler del gestore eventi per garantire il corretto funzionamento del gestore eventi. Per ulteriori informazioni, vedere "Identificazione dei gestori eventi", più avanti in questo argomento.
Nota:
Si osservi, inoltre, che quando si apportano modifiche allo schema nel riquadro attività Origine dati di InfoPath, quando si torna a Visual Studio tali modifiche vengono salvate automaticamente, sovrascrivendo il modello di modulo esistente, senza chiedere conferma all'utente.
Aggiungere un gestore eventi per l'evento OnLoad, OnSwitchView, OnContextChange o OnSign di un modulo
Scegliere Programmazione dal menu Strumenti e quindi fare clic sull'evento del modulo per cui si desidera scrivere un gestore eventi.
Lo stato attivo passerà allo stub del gestore eventi per uno degli eventi seguenti nell'editor di codice: OnLoad, OnSwitchView, OnContextChange o OnSign.
Aggiungere un gestore eventi per l'evento OnSubmitRequest di un modulo
Scegliere Opzioni invio dal menu Strumenti.
Selezionare la casella di controllo Consenti agli utenti di inviare il modulo e quindi fare clic su Esegui azione personalizzata tramite codice.
Fare clic su Modifica codice e quindi su OK.
Lo stato attivo passerà allo stub del gestore eventi per l'evento OnSubmitRequest nell'editor di codice.
Aggiungere un gestore eventi per l'evento OnSaveRequest di un modulo
Scegliere Opzioni modulo dal menu Strumenti.
Nella categoria Apertura e salvataggio fare clic su Salva con codice personalizzato e quindi su Modifica.
Lo stato attivo passerà allo stub del gestore eventi per l'evento OnSaveRequest nell'editor di codice.
Aggiungere un gestore eventi per l'evento OnVersionUpgrade di un modulo
Scegliere Opzioni modulo dal menu Strumenti.
Nella categoria Programmazione selezionare Utilizza evento personalizzato nell'elenco All'aggiornamento della versione e quindi fare clic su Modifica.
Lo stato attivo passerà allo stub del gestore eventi per l'evento OnVersionUpgrade nell'editor di codice.
Aggiungere un gestore eventi per l'evento OnMergeRequest di un modulo
Scegliere Opzioni modulo dal menu Strumenti.
Nella categoria Avanzate selezionare le caselle di controllo Consenti unione moduli e Unisci con codice personalizzato e quindi fare clic su Modifica.
Lo stato attivo passerà allo stub del gestore eventi per l'evento OnMergeRequest nell'editor di codice.
Aggiunta di un gestore eventi per l'evento OnAfterImport
Per aggiungere gestori eventi per l'evento OnAfterImport, è necessario aprire il codice del modulo del modello di modulo con codice gestito e aggiungere manualmente la funzione del gestore eventi. Per informazioni su come scrivere un gestore eventi per questo evento, fare clic sul collegamento dell'evento OnAfterImport.
Aggiunta di un gestore eventi per un'origine dati secondaria
Nel seguente esempio viene mostrato come aggiungere un gestore eventi per un'origine dati secondaria. Viene utilizzata un'origine dati secondaria contenuta in un file di risorse denominato books.xml, a cui è associato il seguente schema:
<?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 visualizzazione del modulo viene generata da questa origine dati. Il codice del modulo crea una tabella hash in base agli autori e al numero di libri che questi hanno scritto. Se si aggiorna una voce della tabella mostrata nella visualizzazione, il gestore eventi OnAfterChange aggiorna la tabella hash. Si noti che per fare riferimento all'origine dati secondaria viene utilizzata la proprietà DataObject dell'attributo InfoPathEventHandler, implementato dalla classe 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());
}
}
}
Identificazione della classe contenente i gestori eventi
Quando si crea un nuovo progetto modello di modulo di InfoPath compatibile con il modello a oggetti con codice gestito di InfoPath 2003, viene applicato un attributo System.ComponentModel.Description a livello di assembly alla classe all'inizio del modulo del codice del modulo per identificare la classe contenente tutti i gestori eventi per il modello di modulo.
![]() |
---|
Evitare di modificare l'attributo System.ComponentModel.Description in questa classe, altrimenti il modello di modulo non sarà in grado di individuare la posizione dei gestori eventi e questi non verranno eseguiti. |
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")>
Identificazione dei gestori eventi
Quando si aggiunge un nuovo gestore eventi utilizzando comandi di menu o pulsanti nell'interfaccia utente in modalità progettazione di InfoPath, lo stub della funzione del gestore eventi viene scritto nel modulo. Nell'esempio seguente viene illustrato il gestore eventi creato per un evento OnValidate aggiunto per un campo denominato "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
È quindi possibile aggiungere codice che richiami i membri del modello a oggetti di InfoPath utilizzando i membri privati nella cache della variabile thisXDocument
o thisApplication
oppure utilizzando i membri a cui si accede dall'oggetto e
EventArgs ricevuto dal gestore eventi:
[C#]
thisXDocument.UI.Alert.(e.Site.text);
[Visual Basic]
thisXDocument.UI.Alert.(e.Site.text)
L'attributo InfoPathEventHandler (definito dalla classe InfoPathEventHandlerAttribute) è l'attributo personalizzato per le funzioni che verranno utilizzate come gestori eventi.
Quando richiesto dall'evento, il parametro MatchPath (definito dalla proprietà MatchPath della classe InfoPathEventHandlerAttribute) specifica un'espressione XPath che identifica l'origine dell'evento. Il parametro EventType (definito dalla proprietà EventType della classe InfoPathEventHandlerAttribute) specifica il tipo di evento. Evitare di modificare i valori di questi parametri, altrimenti potrebbero verificarsi errori o problemi a livello di compilazione del gestore eventi oppure a livello di notifica degli eventi.
Offuscamento del codice nei gestori eventi
Se si esegue un'utilità per l'offuscamento sull'assembly che viene generato quando viene compilato un modello di modulo con codice gestito (nomeprogetto.dll), InfoPath non sarà in grado di caricare l'assembly quando un utente apre il modulo. Se si desidera offuscare il codice dei gestori eventi o di altro codice del modulo, è necessario collocare il codice da offuscare in un assembly distinto e fare riferimento a tale assembly nel progetto, quindi richiamare da FormCode.cs o FormCode.vb i membri dell'assembly a cui si fa riferimento. È importante eseguire l'utilità per l'offuscamento solo sull'assembly a cui si fa riferimento.
Vedere anche
Concetti
Procedura: Rispondere agli eventi del modulo utilizzando il modello a oggetti di InfoPath 2003