InfoPath Erweiterung: Multi-Select ListBox lädt Daten on-demand

Ein Kunde, der InfoPath 2003 einsetzt, hat einige Anforderungen, die sich nicht so einfach umsetzen lassen. Da das große weite Internet leider fast nichts dazu hergibt, hier meine Probleme inkl. Lösungen.

Anforderung 1: Eine "multi-select list box", also eine ListBox zum anhaken. In InfoPath 2007 bereits enthalten, muss diese bei 2003 leider selbst gebaut werden. Dazu gab es einen recht guten Artikel bei InfoPathDev, den ich nun (nach deren umgestaltung) leider nicht mehr wieder finde... Deshalb hier nochmal in Kürze:

Die DataSource Struktur (der InternetPortals Knoten ist repeatable und "internetPortalSelected" ist vom Typ boolean):

image

Nun erstellt man eine optionale Section auf dem Formular, und bindet sie an den "PortalsGroup" Knoten. Innerhalb der optionalen Section erstellt man eine Scrolling Region. Dort zieht man dann den "InternetPortals" Knoten hinein und wählt "Repeating Table". In den Eigenschaften hakt man "Allow users to insert and delete rows" und "Include Header" ab. Außerdem sollte die Tabelle natürlich keine Rahmen haben.

Jetzt nur noch das ganze entsprechend ansortieren, die Textbox durch ExpressionBox ersetzen und als default Wert für den Namen etwas schreiben wie "loading...". Die ID muss dabei dem Benutzer gar nicht gezeigt werden und kann gelöscht werden. So sieht das ganze dann aus:

image

Anforderung 2: Und hier wird es komplizierter. Die ListBox soll nun mit Daten von einem WebService befüllt werden, und zwar erst beim öffnen der Section.
Problem 1 daran ist, dass es im IP 2003 Objektmodell keinerlei Events gibt, die ein aufklappen einer section anzeigen. Das einzige Event, was an der Stelle hilft ist das OnContextChange Event. Dieses wird allerdings ziemlich häufig gefeuert, z.b. bei jedem klick irgendwo auf das Formular, etc.

Problem 2 ist, dass man an die selbstgebaute ListBox keine DataSource anbinden kann (zumindest nicht über Wizards). Hier die Lösung (siehe Kommentare im Code): 

[InfoPathEventHandler(EventType = InfoPathEventType.OnContextChange)]
public void OnContextChange(DocContextChangeEvent e)
{
    if (e.Type == "ContextNode")
    {
        LoadPortals();
    }
}
 
private void LoadPortals()
{
    // Zunächst den Knoten finden der den Repeatable Knoten enthält
    IXMLDOMNode ipGroup = thisXDocument.DOM.selectSingleNode("my:Fields/my:PortalsGroup/my:Portals1");
 
    // Ist dieser null dann ist die section nicht aufgeklappt, es muss nichts getan werden
    if (ipGroup == null)
        return;
 
    // Die DataSource abrufen (hier: "GetInternetPortals"). Diese muss zunächst über
    // Tools->Data Connections angelegt werden und das häkchen bei "Automatically retrieve data
    // when form is opened" muss nicht selektiert werden, denn die Daten sollen ja nur bei Bedarf
    // geladen werden, um so das öffnen des Formulars nicht unnötig zu verlangsamen.
    DataObject dob = thisXDocument.DataObjects["GetInternetPortals"];
    dob.Query();
 
    // Hier müssen die Namespaces gesetzt werden um auf das DOM des WebServices zugreifen zu können.
    // Der erste Namespace ist IP 2003 standard, der zweite muss durch den Namespace
    // des WebServices ersetzt werden. 
    IXMLDOMDocument2 d = (IXMLDOMDocument2)dob.DOM;
    d.setProperty("SelectionNamespaces",
          "xmlns:dfs=\http://schemas.microsoft.com/office/infopath/2003/dataFormSolution\
           xmlns:tns=\"http://MY-WEB-SERVICE-URL.COM/SERVICES\"");
 
 
    // Den Knoten des WebService Response holen (wie dieser Knoten heißt lässt sich am einfachsten
    // raus finden, in dem man im debug modus einfach mal den Inhalt von d.xml anschaut).            
    IXMLDOMNode rootNode = d.selectSingleNode("dfs:myFields/dfs:dataFields/
                   tns:GetInternetPortalsResponse/tns:GetInternetPortalsResult");
 
    // Erst jetzt kann man feststellen, ob die Daten bereits in der Listbox enthalten sind
    if (ipGroup.childNodes.length > rootNode.childNodes.length)
        return;
 
    bool removeFirst = true;
 
    foreach (IXMLDOMNode node in rootNode.childNodes)
    {
        // Hier die beiden Knoten die vom WebService zurückgeliefert werden.
        string id = node.selectSingleNode("tns:Id").text;
        string name = node.selectSingleNode("tns:Name").text;
 
        IXMLDOMNode group = thisXDocument.DOM.
                 selectSingleNode("my:Fields/my:PortalsGroup/my:Portals1");
        IXMLDOMNode field = thisXDocument.DOM.
                 selectSingleNode("my:Fields/my:PortalsGroup/my:Portals1/my:InternetPortals");
        IXMLDOMNode newNode = field.cloneNode(true);
        if (removeFirst)
        {
            group.removeChild(field);
            removeFirst = false;
        }
        // Werte vom neuen Knoten setzen
        newNode.selectSingleNode("my:internetPortalId").text = id;
        newNode.selectSingleNode("my:internetPortal").text = name;
        group.appendChild(newNode);
    }
}

 

Demnächst mehr aus der InfoPath Hell...

InfoPath Bug

Folgendes Szenario: Ein (relativ umfangreiches) InfoPath 2003 Formular, mit Managed Code in .NET 2.0 und ein paar Data Connections die Daten von WebServices abrufen.

Das Formular selbst ist inzwischen ziemlich groß geworden und von einer Sekunde auf die andere lädt das Forumlar einfach nicht mehr. Dazu folgende Fehlermeldung:

The query cannot be run for the following DataObject: XXX
InfoPath cannot run the specified query.
Attachment: Maximum retry on the connection exceeded. - HRESULT=0x80004005: Unspecified error

Nach ein paar google recherchen ist dieser Fehler scheinbar nur in anderen Zusammenhängen bekannt... Also alles mögliche probiert, aber keine Besserung. Dann mal ein neues Formular erstellt, data connection hinzugefügt, geladen --> lädt ohne Probleme.

Nach etwa einem Tag verzweifelten rumprobieren, das Formular mal auf einem anderen Rechner geladen --> lädt ohne Probleme!

Der Unterschied der beiden Systeme: Auf dem, auf dem es nicht läuft, ist nur das Office 2003 SP1 installiert, auf dem anderen SP2!

Lösung also: SP2 installieren.

Trotzdem bleibt es natürlich sehr fragwürdig, wieso es a) lange ging und erst auf einmal nicht mehr und b) ein neues Formular mit den komplett selben Einstellungen läuft.
Mag vielleicht an der größe des Formulars liegen oder an dem Wetter... ;-)

Proxy Switcher v1.0.2

New Version here!


--- English version below ---

Hier gibt es nun endlich ein Tool, dass die nervigen Proxykonfigurationen überflüssig macht.

Wenn man immer unterwegs ist, und mal in dieser Firma, mal in einer anderen Firma, dann im Hotel, zu Hause, etc. und man jedesmal eine andere Proxykonfiguration benötigt, hilft mein neues Tool.

Der große Unterschied zu bestehenden Tools (und davon wird es sicher eine Menge geben) ist der, dass Proxy Switcher nicht nur ein Tasktray Symbol zum schnellen umschalten bietet, sondern dass Proxy Switcher automatisch, je nach Netzwerk, die Proxyeinstellungen setzen kann!

Dazu legt man einmalig die Proxyeinstellungen fest und definiert eine Bedingung, wann dieser Proxy aktiv werden soll. Als Bedingungen stehen derzeit zur Verfügung:
- Eine bestimmte Gateway Adresse
- Der DNS Suffix enthält eine bestimmte Zeichenfolge

Somit werden die enstprechenden Einstellungen aktiv, sobald man ein LAN Kabel einsteckt oder eine WLAN Verbindung herstellt die die entsprechenden Bedingungen erfüllt sind. Kein manuelles klicksen oder tippen mehr.

Also sofort downloaden: Download Installer

Requirements: .NET Framework 2.0 und Windows XP oder Windows Vista

Features:

  • Verschiedene Proxy Einstellungen per Klick abrufen
  • Plugin basiert um die Proxyeinstellugen von verschiedenen Anwendungen zu setzen die nicht auf Internet Explorer Einstellungen zurückgreifen können. Mehr dazu in einem der nächsten Posts.
  • Automatisches Switching von Proxies, je nach Netzwerkkonfiguration

image

Änderungswünsche und Bugs bitte direkt hier in die Kommentare oder per Mail.

-------------------- ENGLISH --------------------

Proxy Switcher is a little helper tool for switching between different proxy settings.

If you are at many locations, e.g. at work, home, hotel, etc. you may be tired of setting (and remember) proxy settings for the different locations.

So, Proxy Switcher will assist you in remeber and easily switch between proxy settings. The major feature which is different from many other tools is, that Proxy Switcher can switch settings automatically depending on network connections.

To make this work, define a new proxy configuration and set a condition for activating it. Possible conditions (in this version) are depending on the DNS suffix (e.g. yourcompany.com) or on the gateway IP address. If you now connect you notebook to a network, the settings will activated automatically.

Another point is, that the application is Plugin-based. So if you have an application which cannot use the Internet Explorer settings write your own plugin for Proxy Switcher. More on this in one of my next posts.

If you have any questions or bugs, leave a comment or drop me a line.

Visual Studio 2008 Beta 2 verfügbar

Die Beta 2 vom Visual Studio 2008 (ehemals Orcas) ist ab sofort verfügbar.

Die beste Einstiegsseite ist die MSDN Subscription Seite falls verfügbar oder hier:
http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx

Dort gibt es auch bereits fertige VPCs mit VS 2008 Team Suite und Team Foundation Server (TFS) vorinstalliert.

Neue Version, neues Layout

Eigentlich wollte ich warten, bis dasBlog dann endlich in Version 2.0 verfügbar ist, aber heute hatte ich gerad mal ein wenig Zeit... Nun gibts auch ein neues, hübscheres Design.

Allerdings lässt sich die configuration page nicht mehr aufrufen... Hoffe mit Version 2 wird dann alles besser. Diese wird dann auch nur noch auf .NET 2.0 aufsetzen und Medium Trust unterstützen, womit das ganze auch in einer Hosting Environment einsetzbar ist.

Team Foundation Server Bugs

Der Team Foundation Server ist im großen und ganzen ein sehr nettes Tool. Insbesondere im Gegensatz zu SourceSafe nicht nur deutlich umfangreicher, sondern er "soll" auch besser sein.

Problem / Bug(?):

- Neue Datei zu einem Projekt hinzufügen oder besser noch durch copy/paste eine vorhandene, eingecheckte Datei in das gleiche Projekt kopieren
- Die soeben neu erstellte Datei umbenennen
- Alles einchecken

Die Datei lässt sich nicht einchecken, obwohl es zunächst so aussieht. Nach beenden und neu starten des Studios hat die Datei überhaupt kein Zeichen mehr vor dem Dateisymbol und ist somit nicht mehr unter Quellcodekontrolle.

Lösung des Problems:

Die Team Foundation Server Power Tools runterladen, installieren und mit der Kommandozeile in den Ordner mit der Solution wechseln, bsp.:

cd "C:\Documents and Settings\user1\Visual Studio 2005\Projects\testproject"

Dann tfpt.exe aufrufen mit: "tfpt.exe online"

Im erscheinenden Fenster die entsprechende Datei anhaken und auf "Pend changes" klicksen. Studio neu starten und die Datei lässt sich wieder einchecken wie gewohnt.

Windows Live Writer Beta 2 verfügbar

Wie ich gerad bei Channel 9 gelesen habe, gibt es ab sofort den Windows Live Writer als Beta 2 zum Download!

Allein für den hübschen neuen SplashScreen lohnt sich der Download ;-)

WriterSplash

Ansonsten hat sich nicht nur die Optik verbessert sondern auch viele andere Dinge, wie z.B., dass man nun endlich auch neue Kategorien erstellen kann, dass man sich warnen lassen kann Kategorien/Titel hinzuzufügen, bevor man einen Artikel published, etc.

Mehr zu den Neuigkeiten gibt es im LiveSide Blog oder direkt beim Windows Live Writer Team.

Ach und wer noch nicht genug Betas auf seinem Rechner hat: Der Live Messenger ist nun auch als Version 8.5 Beta verfügbar.

Neuer RSS Reader: Newzie

Ich nutze bisher RssBandit in der aktuellen Version, die inzwischen ja auch auf Windows Vista läuft. Heute habe ich aber von einem neuen Rss Reader in der c't gelesen, und zwar Newzie.

Klang erstmal ganz interessant und sah sehr nett aus. Also direkt getestet und sofort begeistert!

Er ist im Vergleich zu RssBandit rasend schnell, lässt zwar noch ein paar Dinge vermissen, aber insgesamt bin ich sehr zufrieden und werde in den nächsten Tagen die Alltagstauglichkeit testen.

 

(Klick für großes Bild)

Server Umzug

So, es ist geschafft. Der Server Umzug ist weitesgehend ohne Problem abgelaufen. Wurde aber auch dringend Zeit. Jetzt wird dieses Blog (und noch einige andere Dinge) auf einem schnellen Athlon XP 1800+ mit 1 GB RAM ausgeführt. Im Gegensatz zu dem vorigen virtuellen Server mit 1 GHz und geradezu lächerlichen 256 MB RAM ein rasend schnelles Teil. ;-)

Natürlich läuft das System auf Windows Server 2003 mit ASP.NET 2.0 und SQL Server 2005. Kein PHP, kein MySQL! ;-)

Als Mailserver kommt übrigens der hMailServer zum Einsatz. Sehr zu empfehlen, wird ständig weiterentwickelt und läuft mit MySQL oder SQL Server. Ich glaube der einzige vernünftige kostenlose Mailserver für Windows.