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


Zugriff auf Repeating Sections in InfoPath 2007 Formularen aus C#

InfoPath 2007 Formulare sind sehr mächtig um schnell und strukturiert Daten zu erfassen. Eine der von mir sehr häufig verwendeten Elementen ist die Repeating Group um wiederkehrende Daten zu erfassen.

Oft muss man aus der Repeating-Group heraus Werte von Feldern in derselben Repeating Group manipulieren, die ersten Ideen gingen in die Richtung "Hol Dir doch das Parent" sind leider kläglich gescheitert. Nach etwas Recherche, vor allem dieser Artikel war sehr hilfreich war die Lösung dann klar.

Gehen wir von folgendem Beispiel einer Adresseingabe (mehrere Anschriften pro Person) aus:

Blog1

Nun möchte ich nach dem Verlassen der PLZ Felds den Ort dazu per Datenbank ermitteln. Ich bediene mich hier des Changed Events und lege per VSTA etwas Code dahinter.

Hier das Formular:

blog2

Um die Aufgabenstellung "Ermitteln des Ortsnamens aus der PLZ" greife ich im Changed-Event der PLZ Felds mit C# auf die PLZ zu, und ändere dann entsprechend den Ortsnamen.

Hierzu nutze ich die eigebauten Funktionen für den Zugriff auf die Formulardaten XPathNavigator, dieser hat Hilfsfunktionen für Repeating Sections, diese lassen sich wie C# Arrays mit [index] direkt ansprechen, haben aber darüber hinaus auch noch Hilfsfunktionen wie last() oder first() und für unseren Fall sehr wichtig position() zur Verfügung.

In unserem Beispiel heißt das:

 XPathNavigator DOM = this.MainDataSource.CreateNavigator();
XPathNavigator nodePLZ= DOM.SelectSingleNode("/my:myFields/my:Adresse[position()]/my:PLZ", this.NamespaceManager);
XPathNavigator nodeOrt = DOM.SelectSingleNode("/my:myFields/my:Adresse[position()]/my:Ort", this.NamespaceManager);
string strPLZ = nodePLZ.Value;
string strOrt = "";

//Ermtteln des Orts z.B. aus einer Datenbank
// Code einsetzen der den String Ort füllt

//Setzen des Ort-Werts im Formular
nodeOrt.SetValue(strOrt);

Durch die Funktion postion() brauche ich mir keine Gedanken drum zu machen in welchem Element der Repeating Section ich mich gerade befinde.

Happy repeating

Sven