Silverlight & PHP – Teil 3 (Frontend)

Wie gesagt bin ich leider noch nicht dazu gekommen mich mit WPF & Silverlight eingehend zu beschäftigen. Das ich also auch mit Expression Blend noch nicht viel gemacht habe, versteht sich von selbst (auch wenn ich hierfür auch einen Video Einführungskurs habe). Sprich die GUI ist noch nicht wirklich ansprechend, aber seht selbst:

In Teil 2 haben wir einen Webservice mit PHP erstellt. Jetzt möchten wir die Daten gerne in unserer Silverlight Applikation abfragen. Dazu habe ich mir eine kleine GUI gebastelt.

Silverlight GUI

In Version 1 besteht das ganze aus drei Labels und drei Buttons. Ein Label wird dazu genutzt den aktuellen Stand der Datenbank anzuzeigen. Den Text dafür habe ich bereits vorbereitet. Sprich hier muss nur noch das Datum angefügt werden. Ein weiteres Label nutze ich aktuell zum anzeigen von eventuell aufgetretenen Fehlern.
Die drei Buttons stellen die verfügbaren Kategorien dar. Hier soll in Klammern noch die Anzahl der verfügbaren CDs für jede Kategorie angezeigt werden. Wenn der Aufruf zum Webservice erfolgreich war sieht unser Ergebnis im Browser wie folgt aus:

Silverlight GUI

Auf den XAML Code möchte ich an dieser Stelle gar nicht eingehen. Ich habe wirklich nur die Elemente auf das Formular gezogen und jedem Element einen Namen gegeben. Etwas interessanter wird es beim Aufruf des Webservices. Zum Zugriff auf den Webservice habe ich mir eine eigene Klasse CDManager erstellt, die später meiner GUI die Daten liefert. Damit uns der Webservice zur Verfügung steht muss zu Beginn ein Dienstverweis hinzugefügt werden. Dem Dienstverweis sollte man dann noch einen aussagekräftigen Namen geben. Ich habe hierfür CDManagerWebserviceReference gewählt.

Dienstverweis

Mit folgenden Zeilen wird ein Client für den Webservice erstellt und die Daten abgerufen.

1
2
3
CDManagerWebserviceReference.CDManagerPortTypeClient _client = new CDManagerWebserviceReference.CDManagerPortTypeClient();
_client.getHeaderCompleted += new EventHandler<CDManagerWebserviceReference.getHeaderCompletedEventArgs>(GetHeader_Completed);
_client.getHeaderAsync();

Der Webservice stellt uns asynchrone Methodenaufrufe zur Verfügung. Sprich es wird ein Event ausgelöst, wenn unsere Funktion die Daten vom Webservice geladen hat. Daher wird in der zweiten Zeile dem Eventhandler getHeaderCompleted eine Methode zugewiesen. In der dritten Zeile starten wird bereits mit dem Abrufen der Daten.
Damit wir mit den empfangenen Daten auch vernünftig weiterarbeiten können, habe ich eine kleine Datenklasse HeaderInfo angelegt, die die vier zurückgelieferten Werte aufnimmt

1
2
3
4
5
6
7
public class HeaderInfo
{
    public DateTime LastUpdate { get; set; }
    public int MaxiCount { get; set; }
    public int AlbenCount { get; set; }
    public int DoppelCount { get; set; }
}

Interessant wird jetzt noch wie wir die erhaltenen XML-Daten in die HeaderInfo Klasse bekommen. Sehen wir uns hierzu die Methode GetHeader_Completed etwas genauer an.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void GetHeader_Completed(object sender, CDManagerWebserviceReference.getHeaderCompletedEventArgs e)
{
    if (e.Error == null)
    {
        XDocument doc = XDocument.Parse(e.Result);
 
        IEnumerable<HeaderInfo> headerinfo = from headerdata in doc.Descendants("Header")
        select new HeaderInfo
        {
            LastUpdate = Convert.ToDateTime(headerdata.Element("LastUpdate").Value),
            MaxiCount = Convert.ToInt32(headerdata.Element("MaxiCount").Value),
            AlbenCount = Convert.ToInt32(headerdata.Element("AlbenCount").Value),
            DoppelCount = Convert.ToInt32(headerdata.Element("DoppelCount").Value)
        };
 
        foreach (var item in headerinfo)
        {
            _headerInfo = item;
            break;
        }
    }
}

Ich hab‘ das Ganze zu Demonstrationszwecken etwas verkürzt dargestellt. Ich wollte mich einfach auf die wesentlichen Sachen konzentrieren. Die Prüfung ob beim Aufruf des Webservices ein Fehler aufgetreten ist (Zeile 3) halte ich für wesentlich. War der Aufruf fehlerfrei kann man über e.Result das Ergebnis abrufen – was in unserem Fall ein XML-String ist. Über ein Linq Statement lassen wir uns alle HeaderInfo Elemente zurückliefern (Zeile 7 – Zeile 14). Da unser Webservice in der Regel nur ein HeaderInfo Element zurückliefern wird, können wir die foreach Schleife nach dem ersten Treffer verlassen – die gelesenen Daten merken wir uns. (Zeile 18 & 19).

An sich sind wir nun auch schon am Ende. Wir haben PHP-Webservice. Wir haben eine Silverlight-GUI. Wir haben die Daten vom Webservice abgerufen. Das einzige was uns noch bleibt, ist die Daten anzuzeigen. Die einfachste Möglichkeit ist die Daten den entsprechenden Controls zuzuweisen, so wie man es bereits von Windows Forms gewohnt ist. (Databinding wäre natürlich schöner, aber das kommt dann mit Schritt 2)

Meine – sehr einfache – Funktion zum anzeigen der Daten sieht wie folgt aus:
Ich hole mir die HeaderInfo Daten aus meiner CDManager Klasse und zeige diese dann bei den entsprechenden Controls an.

1
2
3
4
5
6
7
8
HeaderInfo header = _cdManager.GetHeader();
if (header != null)
{
    btnMaxiCDs.Content += " (" + header.MaxiCount + ")";
    btnAlben.Content += " (" + header.AlbenCount + ")";
    btnDoppelCDs.Content += " (" + header.DoppelCount + ")";
    lblInformation.Content += " " + header.LastUpdate.ToString("dd.MM.yyyy");
}

Das war’s. Das vollständige Demo-Projekt gibt’s hier: Visual Studio 2010 – Silverlight Applikation

Es folgt noch ein Teil 4. Dort werde ich das ganze nochmal in 2-3 Sätzen zusammenfassen. Zudem werde ich ein wenig auf die Probleme bei der Entwicklung eingehen und ein paar Links habe ich auch noch …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert