SharePointCommunity
Die deutschsprachige Community für SharePoint, Office 365 und mit Azure
InfoPath-Formulare mit Code erweitern und in SharePoint bereitstellen

Blogs

Fabian´s Blog [SharePoint MVP]

Syndication

In der ersten Jahreshälfte habe ich eine Artikelserie zu InfoPath 2007, Integration in SharePoint 2007 und MOSS Forms Services begonnen (Teil 1, Teil2). Leider fehlte mir die Zeit, das Thema Entwicklung von InfoPath Formularen zu vertiefen, was ich aber hiermit nachholen möchte. Heute werde beschreiben, wie ein InfoPath-Formular mit Managed Code erweitert und als browserbasiert bereitgestellt werden kann. Als Entwicklungswerkzeuge können Visual Studio for Applications (VSTA) oder Visual Studio Tools for Office (VSTO) genutzt werden. Da VSTA in Office 2007 integriert ist, werde ich diese Entwicklungsumgebung als Basis für die Programmierung verwenden.

1. Visual Studio for Applications installieren

VSTA ist standardmäßig nicht installiert und muss zusätzlich für InfoPath registriert werden. (In den Softwarekomponenten) > Office 2007 (Enterprise / Ultimate) anpassen > Features hinzufügen oder entfernen > Microsoft Office und dann die Visual Studio-Tools für Anwendungen aktivieren.

2. Formular um Code erweitern

Hinweis: Wie Formulare entworfen und für die InfoPath Forms Services konfiguriert werden, wird in Teil 2 beschrieben.

Jetzt kann das Formular mit Code gefüttert werden. Zunächst muss in den Formulareinstellungen die gewünschte Programmiersprache und der Projektspeicherort ausgewählt werden. Extras > Formularoptionen > Programmierung

Browserfähige Formular können über die .NET Programmiersprachen C# oder VB.NET entwickelt werden.

Nachdem die vorbereitenden Aufgaben erledigt sind, kann das Formular mit Programmiercode erweitert werden. Über Extras > Programmierung stellt InfoPath verschiedene kontextbasierte Events bereit.

Zum Beispiel kann das Loading-Ereignis dazu genutzt werden, Programmcode beim Öffnen eines neuen Formulars auszuführen. Nach Auswahl einer Ereignisvorlage wird von VSTA das Event und der dazugehörige Event Handler im Code automatisch erzeugt.

public void InternalStartup()
{
    EventManager.FormEvents.Loading += new LoadingEventHandler(FormEvents_Loading);            
}
 
public void FormEvents_Loading(object sender, LoadingEventArgs e)
{  
}
 
Neben den Formularereignissen können auch Steuerelemente durch Event-Handler erweitert werden. Je nach Typ des Controls stehen verschiedene Ereignistypen zur Auswahl.

Zum Beispiel können für Textboxen oder DropDown-Listen Event Handler für das Validating- oder Changed-Ereignisse registriert werden. Natürlich kann auch das Click Event eines Buttons abgefangen werden.

Innerhalb des Codes sind jetzt keine Grenzen mehr gesetzt, da die komplette Funktionsbreite des .NET Frameworts zur Verfügung steht. Klassische Anwendungsfälle sind der Zugriff auf Backend-Daten, die Initiierung von zusätzlichen Prozessen oder auch die manuelle Speicherung der Daten in einer SharePoint-Applikation. Auch die Manipulierung des Formulars selbst kann innerhalb des Programmcodes durchgeführt werden. Da ein InfoPath-Formular nichts weiter als ein XML-Dokument ist, können für diese Aufgabe Klassen aus dem Namensraum System.Xml genutzt werden. Folgender Code soll den Zugriff auf ein Element des Formulars veranschaulichen:

public void InternalStartup()
{
    EventManager.FormEvents.Loading += new LoadingEventHandler(FormEvents_Loading);            
    ((ButtonEvent)EventManager.ControlEvents["btnSend"]).Clicked += new ClickedEventHandler(btnSend_Clicked);
}
 
public void FormEvents_Loading(object sender, LoadingEventArgs e)
{
    XPathNavigator xNavRoot = this.CreateNavigator();
    XPathNavigator xNavDate = xNavRoot.SelectSingleNode("my:urlaubsantrag/my:begin", this.NamespaceManager);
    xNavDate.SetValue(DateTime.Now.AddDays(1).ToShortDateString());
}

Über die Methode CreateNavigator kann aus dem XML-Baum des Dokuments ein XPathNavigator-Objekt erzeugt werden. Dieses Objekt stellt verschiedenen Möglichkeiten bereit, zu den Elemente innerhalb des Baums zu navigieren. In meinem Beispiel erzeuge ich einen neuen XPathNavigator über die SelectSingleNode-Methode . Die Methode erwartet einen XPath-Ausdruck und den Namespace des Dokuments. Keine Angst, der XPath-Pfad muss nicht immer mühsam eingetippt werden. Einfach in den Datenquelle das gewünschte Element auswählen, „XPath kopieren“ und in die Methode einsetzen.

Über die SetValue-Methode kann dann der Wert des Elements gesetzt werden. An dieser Stelle möchte ich auch die Programmierung verlassen und zur Veröffentlichung übergehen. Es gibt zum Thema Entwicklung von InfoPath-Formularen zahlreiche Bücher und Artikel, auf die ich an dieser Stelle verweisen möchte.

3. Formular veröffentlichen

Bevor das Formular veröffentlicht wird, sollte noch einmal geprüft werden, ob es browserkompatibel ist und mindestens die Vertrauensstufe Domäne aufweist. Über das Menü Datei > Veröffentlichen kann dann der Veröffentlichungsprozess initiiert werden. Danach öffnet nicht ein Assistent. Im ersten Schritt wird der SharePoint-Server als Veröffentlichungsziel.

 

Danach muss die URL der Site Collection eingetragen werden, in die das Formular später webbasiert bereitgestellt werden soll. Mit dieser URL wird geprüft, ob die Site Collection alle erforderlichen Features enthält. Im Anschluss erscheint der Bereich für die Auswahl der Dokumentenbibliothek oder des Content Types. Hier wird auch schon der erste Unterschied zu nicht Code-basierten Formularen deutlich. InfoPath-Formulare mit Code können nicht direkt auf eine Dokumentenbibliothek oder einen Content Type veröffentlicht werden. Stattdessen steht die Option zur Auswahl, ein vom Administrator zu genehmigendes Formular zu veröffentlichen, was nichts weiter bedeute als dass es über die Zentraladministration zu einem späteren Zeitpunkt registriert werden muss.

Der nächste Schritt verlangt die Auswahl des lokalen Verzeichnisses, in das das Formular gespeichert werden soll. Zum Schluss können noch die zu veröffentlichen Eigenschaften ausgewählt werden, wonach der Assistent fertig gestellt werden kann.

5. Formular hochladen und aktivieren

Das veröffentlichte Formular kann nun in der SharePoint-Farm registriert und für die Site Collection aktiviert werden. Diese Aufgabe kann über die Zentraladministration oder über STSADM durchgeführt. In der Zentraladministration kann das zuvor veröffentlichte Formular über Application Management > (InfoPath Forms Services) > Upload form template hochgeladen werden.

 

Nachdem das Formular erfolgreich hochgeladen wurde, erscheint es in der Liste der Form Templates. Über das Kontextmenü des neuen Eintrags kann das Formular nun für eine Site Collection aktiviert werden.

 

Was bedeutet jedoch „aktivieren“? Mit der Aktivierung eines Formulars werden eine Reihe von Arbeitsschritten im Hintergrund durchgeführt: Aus dem XNS-Dokument wird eine SharePoint Solution generiert, die ein Feature mit der InfoPath Vorlage und der .NET Assembly enthält.

 

Die Solution wird dann in der SharePoint Farm automatisch deployt und das Feature in der ausgewählten Site Collection aktiviert. Mit der Aktivierung des Features wird das Form Template in die interne Bibliothek FormServerTemplates kopiert.

Nachdem der Aktivierungsprozess beendet ist, kann die interne URL zur Formularvorlage genutzt werden, im das Formular browserbasiert aufzurufen. Zum Beispiel
http://servername/_layouts/formserver.aspx?xsnlocation=/formservertemplates/urlaubsantrag.xsn&openin=browser

Wie man vielleicht sieht, haben browserbasierte Formulare einen Nachteil: Sie werden in einem leeren Browserfenster gerendert, wodurch der komplette Kontext der Webseite verloren geht. Der eine oder andere wird evtl. die Anforderung haben, dieses Formular als Webpart in seine Site Collection zu integrieren. Wie das funktioniert, werde ich im letzten Artikel dieser Serie beantworten.


Bereitgestellt 18 Nov 2007 12:17 von Fabian Moritz

Kommentare

http:// geschrieben re: InfoPath-Formulare mit Code erweitern und in SharePoint bereitstellen
on 19 Nov 2007 9:45

Die Aussage "Innerhalb des Codes sind jetzt keine Grenzen mehr gesetzt, da die komplette Funktionsbreite des .NET Frameworts zur Verfügung steht." ist nicht ganz richtig. Zum Beispiel sind im Code des Formulars private Membervariablen nicht zulässig. Beim Hochladen in der Central Administration erscheint die Meldung "Member variables are not supported. Use the FormState property to store data." Das heißt statt:

private string isValid;

muss das FormState-Object bemüht werden:

private object isValid

{

 get { return FormState["isValid"]; }

 set { FormState["isValid"] = value; }

}

Mit freundlichen Grüßen,

Ronny

fabianm geschrieben re: InfoPath-Formulare mit Code erweitern und in SharePoint bereitstellen
on 19 Nov 2007 9:57

Hallo Ronny,

die Aussage bezieht sich nicht auf die Möglichkeiten der Class-Library selbst, sondern mehr auf die Schnittstellen (auf AD, SP usw.)

Danke für dein Feedback!

Fabian

TrackBack geschrieben SharePoint Kaffeetasse 32
on 20 Nov 2007 13:40

SharePoint Kaffeetasse 32

http:// geschrieben re: InfoPath-Formulare mit Code erweitern und in SharePoint bereitstellen
on 20 Dez 2007 13:54

Hallo!

Die letzten Sätze finde ich sehr interessant: "Wie man vielleicht sieht, haben browserbasierte Formulare einen Nachteil: Sie werden in einem leeren Browserfenster gerendert, wodurch der komplette Kontext der Webseite verloren geht. Der eine oder andere wird evtl. die Anforderung haben, dieses Formular als Webpart in seine Site Collection zu integrieren. Wie das funktioniert, werde ich im letzten Artikel dieser Serie beantworten."

Wann wird dieser Artikel ungefähr kommen?

Gruß,

Katrin

http:// geschrieben re: InfoPath-Formulare mit Code erweitern und in SharePoint bereitstellen
on 27 Dez 2007 4:57

Hi Ronny,

Can u translate this in English for me :-)

in cluding the FormState part of the coding.

I am really interested to go through this topic.

Thanks,

Zullu

Jonka geschrieben re: InfoPath-Formulare mit Code erweitern und in SharePoint bereitstellen
on 9 Jan 2008 15:46

Hi,

das Einbetten der InfoPath Formulare in den SharePoint Kontext würde mich auch brennend interessieren, denn meiner Ansicht nach gibt es keine echte Lösung dafür.

Einzig der Workaround das Formular als IFrame einzubetten (über das PageViewer WebPart) dürfte funktionieren. Dadurch werden allerdings einige eigentlich triviale Vorgänge recht kompliziert, wie z.B. Refresh der aktuellen SharePoint Seite, Übergabe von Query-Parametern, usw.

Gruß

Jonka

http:// geschrieben re: InfoPath-Formulare mit Code erweitern und in SharePoint bereitstellen
on 17 Jan 2008 8:44

Hi Fabian,

super Artikel! Hätte mir vor einem halben Jahr viel Arbeit und Nerven gespart. ;-)

Eine Sache möchte ich noch zu "genehmigten" InfoPath-Formularen loswerden. Sie lassen sich, wohl weil es sich um Solutions handelt, nur noch sehr schwer verändern. Während man in "normalen" Formularen problemlos weitere Felder ergänzen kann. Zudem hängt beim Erstellen der Solution die ganze Webanwendung, was die Sache nicht gerade alltagstauglich macht. Außerdem kann eine InfoPath-Solution nur global bereitgestellt werden. Alles Dinge, die mich zweimal überlegen lassen, bevor ich Formulare mit Code verwende. Oder gibt es Lösungen?

Viele Grüße,

Andreas

http:// geschrieben re: InfoPath-Formulare mit Code erweitern und in SharePoint bereitstellen
on 1 Feb 2008 8:34

Hallo,

wir fragen uns zur Zeit, wie man InfoPath/Sharepoint Deployment über Entwicklungs-,Test- und Produktiv-System machen kann, wenn doch die Connections zu SharePoint in den InfoPath Dokumenten fest verdrahtet sind? Müssen für jeden SharePoint-Server die InfoPath Dokumente angepasst, oder kann man dynamisch und abhängig vom SharePoint-Server Connections hinterlegen?

Gruß, Harald

SharePoint-Laie geschrieben re: InfoPath-Formulare mit Code erweitern und in SharePoint bereitstellen
on 26 Jan 2010 11:42

Wie kann ich das InfoPath Formular in den Sharepoint hochladen/aktivieren, nachdem ich es veröffentlicht habe.

Nach dem Veröffentlichen taucht es bei mir im SharePoint leider nicht auf.

Anmerkung: Formular enthält C#-Code

Cango geschrieben re: InfoPath-Formulare mit Code erweitern und in SharePoint bereitstellen
on 8 Feb 2010 13:57

Hallo,

wie sieht das mit x64 SharePoint Servern aus?

Soweit ich weiß, kann man im Code von InfoPath keine 64 bit dlls referenzieren. Man kann schon, es knallt dann aber z.B. bei der ersten Instanziieung von SPSite, da InfoPath im 32 bit prozess läuft.

Gibt es ein Workaround für dieses Problem.

Bettina Vracaric geschrieben re: InfoPath-Formulare mit Code erweitern und in SharePoint bereitstellen
on 10 Feb 2010 15:03

Ein wirklich feinsinniger Blogg

Hanspeter Undere geschrieben re: InfoPath-Formulare mit Code erweitern und in SharePoint bereitstellen
on 10 Feb 2010 16:50

Da werde ich jetzt oefter einmal meine Meinung abgeben.

Fabian Moritz geschrieben re: InfoPath-Formulare mit Code erweitern und in SharePoint bereitstellen
on 12 Feb 2010 8:09

Hallo Cango,

auch in 64-bit-Umgebung funktioniert diese Verfahrensweise.

Fabian

Fabian Moritz geschrieben re: InfoPath-Formulare mit Code erweitern und in SharePoint bereitstellen
on 12 Feb 2010 8:11

Hallo Harald!

Die Antwort heißt Features! Du kannst jedes InfoPath-Formular auch über Features deployen. Ist nicht ganz so einfach aber funktioniert. Zusammen mit einer Solution lässt sich hiermit ein vollständiges Deployment-Szenario abbilden. Wenn es Dich interessiert, kann ich dazu mal was bloggen.

Fabian

Jochen geschrieben re: InfoPath-Formulare mit Code erweitern und in SharePoint bereitstellen
on 18 Feb 2010 15:01

hallo fabian,

an einem solchen deployment-szenario bin ich brennend interessiert.

im augenblicklichen standardprozess (ueber die central admin) wird beim hochladen und aktivieren des formulars eine automatischer featurename generiert.

dies finde ich sehr unschoen, wir haben im unternehmen eine namenskonvention, die ich gerne damit einfliessen lassen moechte.

der naechste punkt ist ist die sichtbarkeit des feature in den websitefeatures. auch dies ist nicht gewuenscht und sollte unsichtbar (hidden) gesetzt werden, da eine entwickeltes formular nur fuer eine bestimmte site entwickelt wurde.

das thema datenverbindung ist fuer mich auch sehr interessant, da das formular in einer dev-umgebung entwickelt wurde und nun im produktionsumfeld mit anderen datenverbindungen veroeffentlicht werden muss.

wenn du also eine "bastelanleitung" haettest, waere das echt super.

gruss

jochen

Jochen geschrieben re: InfoPath-Formulare mit Code erweitern und in SharePoint bereitstellen
on 18 Feb 2010 15:05

hallo fabian,

an einem solchen deployment-szenario bin ich brennend interessiert.

im augenblicklichen standardprozess (ueber die central admin) wird beim hochladen und aktivieren des formulars eine automatischer featurename generiert.

dies finde ich sehr unschoen, wir haben im unternehmen eine namenskonvention, die ich gerne damit einfliessen lassen moechte.

der naechste punkt ist ist die sichtbarkeit des feature in den websitefeatures. auch dies ist nicht gewuenscht und sollte unsichtbar (hidden) gesetzt werden, da eine entwickeltes formular nur fuer eine bestimmte site entwickelt wurde.

das thema datenverbindung ist fuer mich auch sehr interessant, da das formular in einer dev-umgebung entwickelt wurde und nun im produktionsumfeld mit anderen datenverbindungen veroeffentlicht werden muss.

wenn du also eine "bastelanleitung" haettest, waere das echt super.

gruss

jochen