WCF Schnittstelle nutzen

  • .NET (FX) 4.5–4.8
  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von vbBeginner.

    WCF Schnittstelle nutzen

    Hallo Leute,
    ich bin neu in diesem Forum und auch neu in VB.
    Im Moment versuche ich ein kleines Programm zu schreiben welches sich unter anderem einer WCF Schnittstelle bedienen soll.
    Leider habe ich damit keinerlei Erfahrung. Ich in jetzt so weit gekommen, dass ich eine Liste in eine Variable einlesen kann, jedoch gelingt es mir nicht, den gewünschten Wert zu extrahieren. Ich würde damit gerne eine Combobox befüllen.
    Im Anhang der Wert den ich gerne hätte.
    Vielleicht kann mir hier jemand dabei helfen.
    Danke für eure Unterstützung.

    Label korrigiert. Verschoben. ~Thunderbolt
    Bilder
    • Color.jpg

      101,55 kB, 630×455, 256 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    als allererstes solltest du die Visual Studio - Empfohlene Einstellungen tätigen, denn offsichtlich proggst du mit Option Strict Off, und so ist Vb.net ein inkonsistenter Hybrid aus VB6 und OOP.
    Und damit kann man sich nicht in die OOP-Sprache einarbeiten, sondern gewöhnt sich nur schlechte Gewohnheiten an.
    Insbesondere missachtet man dabei pausenlos das OOP-Prinzip "Datentyp".

    Also erstmal Visual Studio - Empfohlene Einstellungen machen, vorher ist nicht sinnvoll, weiterzumachen, und den Datentyp da näher zu untersuchen.

    Weil du willst da iwas eine Variable Color zuweisen, aber welchen Datentyp soll die denn haben? Das solltest du erstmal korrekt deklarieren, und nicht der vb6-Schmuddelei überlassen.
    OK. Habe Strict auf on gestellt.
    Ja wenn ich das wüste. Letztendlich ist es natürlich ein String,
    muss jedoch ausgelesen werden aus einem WindowsApplication1.ServiceReference1.ListItem
    in dem dann WindowsApplication1.ServiceReference1.Color steckt.

    Eigentlich will ich nur die Liste in ein Dropdown einlesen.
    Mit ComboBox1.DataSource = client.GetListByName(pListType:="Color")
    bekomme ich leider nur die ID's.

    Wie gesagt, bin neu auf dem gebiet, bitte um Verständnis. ;)
    na, aber wenn du dein Bildle anguckst, dann siehst du , dasses kein String ist, sondern ein SeviceReference1.ListItem() Und beachte auch die () am Ende, es ist also ein Array von ListItems.
    Davon der erste Wert, also an Position (0) - guck dein Bildle an! - ist eine SeviceReference1.Color.

    Das ist etwas unerfreulich, dass im ListItem-Array nicht SeviceReference1.ListItem drinne sind, sondern auf einmal ein anderer Datentyp: SeviceReference1.Color. Offensichtlich handelt es bei dem, was client.GetListByName() zurückliefert, um eine polymorphe Auflistung, wo alles mögliche drinne sein kann.
    Da allerdings client.GetListByName() als Argument einen pListType übergeben bekommt (gugge deinen Code!), nehme ich an, dass die Liste doch immer nur Dinge eines Datentypen enthält, entsprechend dem, was als pListType angegeben ist.
    In diesem Falle dürfte die Liste also lauter SeviceReference1.Color enthalten (78 Stück, ums in Zahlen zu sagen - gugge Bildchen!).
    Also müsstest du die ganze Liste sehr elegant in ein ordentliches SeviceReference1.Color() (die () bemerkt? - es ist ein Array!) umwandeln können:

    VB.NET-Quellcode

    1. dim colorInfos As SeviceReference1.Color() = client.GetListByName("color").Cast(Of SeviceReference1.Color).ToArray()

    Wenn das klappt (ich bin nicht sicher), kann man von diesen Color-Dingern recht hübsch die Color-Namen abrufen, sogar in 8 verschiedenen Sprachen (denn DisplayNames ist auch ein Array - gugge Bildchen!):

    VB.NET-Quellcode

    1. dim colorInfoDisplayName = colorInfos(0).DisplayNames(0)
    2. Messagebox.Show(String.Format("Name in {0}: {1}", colorInfoDisplayName.Key, colorInfoDisplayName.Value))
    (ungetestet)

    Gehört nicht direkt hierher, aber um einige Begriffe zumindest mal andeutungsweise zu klären (hier v.a. Auflistung, Array): Grundlagen: Fachbegriffe

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Super! Der erste Teil hat geklappt.

    VB.NET-Quellcode

    1. Dim colorInfos As ServiceReference1.Color() = client.GetListByName("Color").Cast(Of ServiceReference1.Color).ToArray()


    Ich weis zwar nicht warum, aber beim zweiten Teil, heißt es plötzlich Keys und Values.

    VB.NET-Quellcode

    1. Dim colorInfoDisplayName = colorInfos(0).DisplayNames()
    2. Dim ColorDE = colorInfoDisplayName.Values(0)


    Hier bekomme ich die Farbe in meine Variable.
    Die letzte Zeile bringt leider nicht den gewünschten Erfolg:

    VB.NET-Quellcode

    1. MessageBox.Show(String.Format("Name in {0} : {1}", colorInfoDisplayName.Keys, colorInfoDisplayName.Values))

    Hier bekomme ich:
    "Name in
    System.Collection.Generic.Dictionary`2+KeyCollection[System.String.String]:
    System.Collection.Generic.Dictionary`2+ValueCollection[System.String.String]:

    Ich könnte jetzt natürlich eine Schleife bauen, und Damit meine Combobox befüllen.
    Aber gibt es da nicht einen einfacheren weg um alle Displaynames von values(0) in ein Array zu bekommen?

    Vielen Dank für deine Hilfe soweit.
    du musst mein Code halt richtig abschreiben

    VB.NET-Quellcode

    1. dim colorInfoDisplayName = colorInfos(0).DisplayNames(0)
    2. 'ist ungleich
    3. dim colorInfoDisplayName = colorInfos(0).DisplayNames()

    am besten kopiert man Code - Guttenberg-Tasten - muss man kennen!, also in diesem Fall den Code aus post#4 kopieren.
    Kopiert hatte ich ihn natürlich zuerst. Nur bekam ich dann diesen Fehler:

    Eine nicht behandelte Ausnahme des Typs "System.Collections.Generic.KeyNotFoundException" ist in mscorlib.dll aufgetreten.
    Zusätzliche Informationen: Der angegebene Schlüssel war nicht im Wörterbuch angegeben.

    Deswegen die Änderung.

    Ps:
    So komme ich zum richtigen Ergebnis:

    VB.NET-Quellcode

    1. Dim colorInfoDisplayName = colorInfos(0).DisplayNames()
    2. MessageBox.Show(String.Format("Name in {0} : {1}", colorInfoDisplayName.Keys(0), colorInfoDisplayName.Values(0)))
    3. Noch irgend eine Idee wegen der Liste von Namen,
    4. oder doch eine Schleife basteln?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vbBeginner“ ()

    wird immer verwirrender.

    den Strings von Value(0) gibts garnet.

    Es gibt Values, und es gibt Values(0), und welchen Datentyp letzters hat, haste das inzwischen raus?

    Und was soll nun "den Strings aus Value(0) von Displaynames (Of String, String) von allen colorinfos" sein?

    Ein colorInfo hat offsichtlich mehrere Displaynames, nämlich Namen in verschiedenen Sprachen. Was willst du nun in ein Array packen?

    vbBeginner schrieb:

    Und ich hätte gerne alle Deutschen Farbnamen in einem Array.
    jo, so kann man das verstehen.

    probierma

    VB.NET-Quellcode

    1. dim germanColNames = colorInfos.Select(function(inf)inf.DisplayNames.Values(0)).Toarray()
    Aber genau weiß ichs nicht, es ist halt ein Datentyp aus dem WebService, und um zu verstehen, wie der genau tickt, müsste man ihn sich im ObjectBrowser angucken, zB ob er vlt. IDictionary implementiert oder sowas.
    Die Sache ist aber nicht ganz sicher.
    Es ist möglich, dass die deutschen Namen mal nicht am Index 0 liegen, bzw. es kann auch sein, dass überhaupt keine deutschen Namen angeboten werden.
    So verstehe ich jedenfalls diese Objekt-Struktur mit der scheinbar variablen Liste von Farb-Namen in verschiedenen Sprachen.

    Allerdings dass abstürzt ist eher unwahrscheinlich, denn in irgendeiner Sprache werden die Namen ja wohl bereitgestellt werden.
    (Aber auch das ist nicht 100% sicher, und wenns für was professionelles ist, musst du dagegen absichern.)
    Danke, aber die deutschen Namen sind zu 100% gefüllt. Dies wird schon von dem Programm davor geprüft.
    Aber nun habe ich einiges ändern müssen dank Option Strict.
    Mach ich natürlich gerne um mir nichts falsches anzugewöhnen.
    Allerdings benutze ich Excel Funktion:

    VB.NET-Quellcode

    1. exApp.ActiveSheet.Unprotect(Password:="blablub"

    hier meckert Option Strict auch, was soll ich denn da für einen Typ Angeben?
    ActiveSheet müsste als Worksheet gecastet werden.
    DirectCast(exApp.ActiveSheet, Excel.Worksheet).Unprotect
    In der Tat ist Office.Interop sehr cast-intensiv, weil es quasi das komplette Excel-Objektmodell wrappt.

    Aber zum eigentlichen Thema:
    Bist du dir sicher, dass du ActiveSheet verwenden musst?
    Kannst du das Sheet nicht direkt adressieren?
    ActiveSheet kann sich durch einen User-Klick verändern und dein Programm steht im Wald.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Leider noch immer der selbe Fehler.
    Wobei z.b.

    VB.NET-Quellcode

    1. exApp.ActiveWorkbook.SaveAs("blablub.xls")

    komischerweise ohne Probleme funktioniert.

    Warksheet habe ich jetzt mit Namen angesprochen. Ist sicher besser.
    Funktioniert nur leider auch nicht.

    VB.NET-Quellcode

    1. DirectCast(exApp.Worksheets("Name").Unprotect(Password:="blablub"))


    Und er will am Schluss als zweites Argument noch den TYP.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „vbBeginner“ ()

    vbBeginner schrieb:

    Und er will am Schluss als zweites Argument noch den TYP.
    Ja, das ist so bei DirectCast( , ). Ist halt eine Typ-Umwandlungs-Funktion - Nomen est Omen!
    vlt. guckst du nochmal genau, was petaod dir vorgemacht hat.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()