none
GridView -> Klick Item -> Parameterübergabe RRS feed

  • Frage

  • Hallo am Ostersonntag (o;

    Ich habe gerade ein erstes C# Konstrukt unter Windows 8.1 zum Laufen gebracht.....eine GridView, dessen Daten per JSON von meinem Webserver gefüttert werden.

    Das Programm soll meiner Freundin die Arbeit erleichtern, um Bestellungen aus dem Onlineshop abzuarbeiten.

    Nun die Frage als absoluter Windows 8.1 Neuling (o;

    Ich will von der Startseite, wo aktuelle Bestellungen angezeigt werden, per Klick darauf auf eine Detailseite gelangen, wo dann die einzelnen Positionen und Infos ebenfalls per JSON gefüttert werden. Das heisst, irgendwie müsste ich die eindeutige ID mitgeben können im Link in der GridView?


    Sonntag, 5. April 2015 12:51

Antworten

  • Hallo,

    du hast einen anonymen Typ - also nichts typsicheres als Parameter. Du kannst damit über dynamic heran kommen:

    dynamic d = e.Parameter;
    var wert = d.Eigenschaft;

    Das funktioniert an sich zwar erstmal, nur wird dir der Compiler nicht weiter helfen, wenn du dich mal bei einer Eigenschaft vertippt hast. Auch bekommst du nur sehr wenige Vorschläge seitens IntelliSense, was du an der jeweiligen Stelle schreiben kannst.

    Du hast irgendwo diese Objekte deklariert - das müsste folgende Form haben:

    new {
      EigenschaftA = "A",
      EigenshcaftB = 12,
      //...
    }

    Damit wird ein anonymer Typ erstellt, tausche das besser gegen einen richtigen Typ aus:

    new OrdersClass(){
      EigenschaftA = "A",
      //...
    }

    Dann funktioniert auch wieder die Konvertierung in OnNavigatedTo in ein OrdersClass-Objekt.

    PS: Was auch Thomas schon schrieb sollte man immer sehr aufpassen wenn man mit echten Daten hantiert. Einerseits bei der Veröffentlichung, andererseits auch beim testweisen verarbeiten der Daten - nicht das da mal etwas verloren geht.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Montag, 6. April 2015 12:34

Alle Antworten

  • Hallo Richard,

    Das GridView hat ein ItemClick-Ereignis, welches ausgelöst wird, wenn man auf ein Item de GridView klickt. Innerhalb des Eventhandlers kannst du den DataContext des Items über e.ClickedItem abfragen. Dieses wiederum kannst du der Navigate-Methode übergeben:

    private void GridView_ItemClick(object sender, ItemClickEventArgs e)
    {
        this.Frame.Navigate(typeof(MySubPage), e.ClickedItem)
    }
    In OnNavigatedTo auf der Zielseite kannst du das Objekt dann wieder abfragen und weiter verarbeiten:
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
        var dc = e.Parameter as MyContextType;
    }
    Wichtig ist eben nur, dass dein DataContext alles enthält, was du für die weitere Verarbeitung brauchst.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Sonntag, 5. April 2015 13:15
  • Hallo Tom

    Habe eine 2. Seite als Basic Page hinzugefügt, damit ich den "Back Button" habe...und die Vor/Zurücknavigierung funktioniert ohne zutun (o;

    Und die Parameter werden auch schön übergeben. Macht langsam Spass, auf Windows 8.1 zu entwicklen...

    Auch Remote Starten auf dem Minnowboard läuft wunderbar...

    Nur eine kleine Frage noch....gibt es eine einfache Möglichkeit, um zu Debuggingzwecken einen einfachen Dialog anzuzeigen wie in etwa mit Javascript Alert()?

    Sonntag, 5. April 2015 14:12
  • Da hat .NET viele Möglichkeiten. Das meiste geht mit Hilfe der Debug-Klasse. Diese hat beispielsweise eine WriteLine-Methode um Informationen im Ausgabefenster von VS auszugeben. Das ist die übliche Vorgehensweise.

    Direkt kleine Fenster anzeigen geht in den Apps nicht mehr - dort gibt es nur den MessageDialog:

    await new MessageDialog("Nachricht", "Titel").ShowAsync();

    Das ist natürlich deutlich länger als Alert, weswegen man dann doch meistens die Debug-Klasse nutzt.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Sonntag, 5. April 2015 14:19
  • Hmm...irgendwie klappt das nicht mit dem Zugreifen auf die einzelnen Werte...

    Sehe da schon in "OnNavigatedTo", dass e.Parameter Werte drin hat, und auch die einzelnen Elemente darunter auflistet wie e.Parameter.Order_ID, e.Parameter.Address usw...

    Aber das Zuweisen mit

    var order = e.Parameter as OrdersClass;

    ergibt immer "null"...

    Oder ich packe das ganz falsch an (o;

    Sonntag, 5. April 2015 14:59
  • Hallo,
    OrdersClass müsste bei deinem Code der Typ sein, der auch eine Kachel in der GridView mit Daten befüllt. Als das T in ObservableCollection<T>, wenn du damit ItemSource befüllst.

    Sonst kannst du auch mal e.Parameter.GetType() aufrufen und gucken was dir zurück gegeben wird. Somit erfährst du garantiert den Typ vom Parameter. IMHO zeigt IntelliSense den Typ auch mit an, wenn man den Baum aufklappt (den in dem kleinen Tooltip um an die Eigenschaftswrete heran zu kommen).


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Montag, 6. April 2015 02:53
  • Ich habe da als Start dieses Beispiel Projekt genommen, das meinen Bedürfnissen mit JSON am nächsten kam:

    http://www.c-sharpcorner.com/UploadFile/c25b6d/create-a-web-api-and-consume-it-in-the-windows-8-apps/

    Eigenartig ist dabei, das im Beispiel Projekt zwar die Klasse Class1 auch definiert wird, aber nirgends angewendet wird.

    Mit var test = e.Parameter.GetType() erhalte ich dann:

    -  test {Name = "<>f__AnonymousType0`7" FullName = "<>f__AnonymousType0`7[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"} System.Type {System.RuntimeType}

    Aber e.Parameter zeigt mir die richtigen Werte an:

    +  Parameter { Order_ID = 1314, Order_Date = 05.04.15, Firstname = Blah, Lastname = Blah, Address = Strasse 12, ZIP = 4711, City = Irgendwo} dynamic {<>f__AnonymousType0<string,string,string,string,string,string,string>}


    Montag, 6. April 2015 10:10
  • Ähm... Richard.

    Diene Abdeckung des Namens ist nichts komplett. Daniele Mazenauer lässt grüßen...

    Tipp, entferne das Bild schnell, ehe es ... ähm ... unannehmlichkeiten geben könnte.


    © 2015 Thomas Roskop

    Germany // Deutschland

    Montag, 6. April 2015 10:27
  • Hallo,

    du hast einen anonymen Typ - also nichts typsicheres als Parameter. Du kannst damit über dynamic heran kommen:

    dynamic d = e.Parameter;
    var wert = d.Eigenschaft;

    Das funktioniert an sich zwar erstmal, nur wird dir der Compiler nicht weiter helfen, wenn du dich mal bei einer Eigenschaft vertippt hast. Auch bekommst du nur sehr wenige Vorschläge seitens IntelliSense, was du an der jeweiligen Stelle schreiben kannst.

    Du hast irgendwo diese Objekte deklariert - das müsste folgende Form haben:

    new {
      EigenschaftA = "A",
      EigenshcaftB = 12,
      //...
    }

    Damit wird ein anonymer Typ erstellt, tausche das besser gegen einen richtigen Typ aus:

    new OrdersClass(){
      EigenschaftA = "A",
      //...
    }

    Dann funktioniert auch wieder die Konvertierung in OnNavigatedTo in ein OrdersClass-Objekt.

    PS: Was auch Thomas schon schrieb sollte man immer sehr aufpassen wenn man mit echten Daten hantiert. Einerseits bei der Veröffentlichung, andererseits auch beim testweisen verarbeiten der Daten - nicht das da mal etwas verloren geht.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Montag, 6. April 2015 12:34
  • Hallo Tom

    Jetzt musste ich grad ne Weile überlegen, da ich absolut nicht aus der Welt mit Klassen, Objekten usw. komme (o;

    Meine Welt ist die Hardwareentwicklung sowie handfeste Assembler/C-Programmierung mit ein wenig PHP/Ajax dazu (o;

    Nachdem ich nun in der Hauptseite das "select new" durch ein "select new OrdersClass()" ersetzt habe, funktioniert es nun einwandfrei :-)

    Muchas gracias aus .ch (o;

    richard

    Montag, 6. April 2015 12:53