Announcement

Collapse
No announcement yet.

Daten aus csv-Datei in SilverLight

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Daten aus csv-Datei in SilverLight

    Hallo, erste gehversuche in SilverLight. Ein vorhandenenes C# Programm in SilverLight nachempfinden. Die benötigten Daten stehen in einer csv Datei. Ich vermute mal, ich muß die Datei als Ressource hinzufügen. Das mache ich, indem ich im Projektmappenexplorer auf die Application gehe und mit RMT - hinzufügen - vorhandenes Element, meine csv Datei hinzufüge. Richtig? Dann habe ich diesen Quelltext:

    Code:
    Uri uri=new Uri("name.csv",UriKind.Relative);
    StreamResourceInfo sri = Application.GetResourceStream(uri);
    StreamReader sr = new StreamReader(sri.Stream);
    while (sr.Peek() >= 0) listBox5.Items.Add(sr.ReadLine());
    sr.Close();
    
    Der Compiler meckert nicht, bei der Ausführung bleibt der Debugger in der mittleren Zeile stehen. new StreamReader bringt eine Exception, weil sri null ist. Was ist denn bei der Initialisierung von sri schiefgelaufen, wie macht man es richtig?

    Danke - Günther
    Günther

  • #2
    Hallo,

    hatte gestern das gleiche Problem

    Guck mal: How to get File from Resources in SL.

    Setz einen '/' vor name.csv.



    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hallo, erst einmal vielen Dank. Das Beispiel von silverlightexamples.net hatte ich gestern schon gefunden. Mein Problem besteht eigentlich aus zwei Fragen, vielleicht ist der Code ja im Prinzip richtig.

      Die erste Frage lautet, wie füge ich meine Ressource hinzu, wo muß diese dann im Projektmappen-Explorer erscheinen? Es gibt dort die beiden Root-Einträge
      SilverlightApplication1 und
      SilverlightApplication1.Web. In welchem dieser Ordner muß die Ressource stehen, oder eventuell in einem Unterordner? Logisch wäre ja der Subordner SilverlightApplication1.Web/App_Data. Und wo muß sich die Datei auf der Festplatte befinden. Vielleicht mache ich hier schon den Fehler.

      Ach ja, das mit dem '/' habe ich auch ausprobiert und zig andere Variationen. Ohne Erfolg.
      Günther

      Comment


      • #4
        Hallo,

        SilverlightApplication1.Web ist der Serverteil und auf diese Daten kannst du dann vom SilverlightApplication1-Teil (der im Browser des Clients läuft) nur per WebClient zugreifen.

        Daher pack die Dateien (wenn sie nicht riesig sind) mit in das Silverlight-Projekt und stell unter den Dateieigenschaften unter "Build Action" den Wert "Content" ein. Dann wird die Datei mit in XAP gepackt ("gezipped").

        Dann ist der Zugriff so wie im Link gezeigt möglich. Wenn deine 'Data.csv' zB in einem Unterverzeichnis 'data' liegt -> "data/Data.csv"
        Code:
        StreamResourceInfo sr = Application.GetResourceStream(
            new Uri("data/Data.csv", UriKind.Relative));
        mfG Gü


        PS: Wie hast du es geschafft dass dein Code mit dem VS-Highlighting dargesetllt wird?
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          er hat es selbst formatiert sehr aufwendig
          Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

          Comment


          • #6
            Originally posted by das-d View Post
            er hat es selbst formatiert sehr aufwendig
            Nein, Nein. Ich hab den Code aus Visual Web Developer 2010 Express in die Zwischenablage kopiert und dann hier im Editor zwischen den Code-Tags wieder eingefügt.

            Also, mit der Einstellung content und einer sinnvollen Ordnerstruktur klappt es jetzt. Wunderbar - Danke.

            Schade, daß es kein ArrayList gibt, da muß ich dann auf ListBox zurückgreifen und die Box unsichtbar machen.

            Daher pack die Dateien (wenn sie nicht riesig sind) mit in das Silverlight-Projekt
            Wie definiert man "riesig"? Die gesamte Datenmenge im .exe Projekt beträgt momentan 635 kB in verschiedenen kleinen csv Dateien. Die Datendatei mit der ich jetzt den Anfang mache ist mit 365 kB die größte Datei, von dieser wird aber in der Regel nur ein Bruchteil benötigt. Ist es sinnvoll die Daten komplett zu packen, oder sollte die Anwendung möglichst nur die wirklich benötigten Daten vom Server lesen? Eventuell könnte man auch die immer benötigten Daten packen und den Rest bei Bedarf nachladen.

            Oder sollte man sogar besser auf eine SQL Datenbank zurückgreifen, wenn man aus 3800 Datensätzen den 2966. herauslesen möchte?
            Zuletzt editiert von Günther Weber; 29.07.2010, 11:40.
            Günther

            Comment


            • #7
              Originally posted by Günther Weber View Post
              Schade, daß es kein ArrayList gibt, da muß ich dann auf ListBox zurückgreifen und die Box unsichtbar machen.
              Applaus für Microsoft das die diese Altlast in Silverlight entsorgt haben. Das ist ein Grund mehr sich das mal näher anzusehen.
              Nimm eine generische Liste.

              Comment


              • #8
                @Ralf:

                Schon geändert - Danke!

                Ich denke mir, der Nachteil der ArrayList war, daß man alle möglichen Objekttypen in eine einzige Liste reipacken konnte? Wäre aber in meinen Augen auch kein großer Nachteil, man muß dann nur immer prüfen, was man da grade vor sich hat.
                Günther

                Comment


                • #9
                  Hallo,

                  auch kein großer Nachteil, man muß dann nur immer prüfen, was man da grade vor sich hat.
                  Und mit List<T> übernimmt der Compiler diese Prüfung schon zur Entwurftzeit - praktisch

                  der Nachteil der ArrayList war, daß man alle möglichen Objekttypen in eine einzige Liste reipacken konnte?
                  Ja. Das lässt sich alles mit Generika eleganter lösen. Eventuell auch über gemeinsame Basisklassen (aber nicht object verwendet )

                  Ich finde aus gut dass Mircosoft in Silverlight die Altlasten nicht implementiert hat.

                  Schade, daß es kein ArrayList gibt, da muß ich dann auf ListBox zurückgreifen und die Box unsichtbar machen.
                  Nimm das ItemsControl (denke dass das ist was du willst).

                  Wie definiert man "riesig"?
                  Gute Frage
                  Das XAP muss ja vom Server beim Clientzugriff irgendwie zum Client gelangen. Das irgendwie spielt sich dabei im Internet ab. Wenn als eine riesige XAP übertragen werden muss dauert das dem Client zu lange. Riesig wäre irgenwas mit > 5 MB oder so. Es haben ja nicht alle Highspeed-Internetzugänge.


                  mfG Gü

                  PS: Das mit dem Code-Einfügen geht bei mir nicht Liegst daran dass du IE und ich FF verwende?
                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                  Comment


                  • #10
                    PS: Das mit dem Code-Einfügen geht bei mir nicht Liegst daran dass du IE und ich FF verwende?

                    Stimmt. Mit IE8 gehts, mit FF nicht.
                    Günther

                    Comment


                    • #11
                      interessant damit hätte ich nicht gerechnet dass es per Einfügen geht ...
                      Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

                      Comment


                      • #12
                        Nimm das ItemsControl (denke dass das ist was du willst).
                        Ich denke mal, um diese csv Daten aufzunehmen ist
                        Code:
                        List<string>
                        ideal. Dann habe ich diverse Datenstrukturen als class
                        definiert, da dürfte

                        Code:
                        List<myClass>
                        zutreffen. Erst dann wenn verschiedene Strukturen gemischt
                        werden, das ItemsControl. Aber ich glaube, sowas hab
                        ich nicht.

                        Übrigens schreib ich jetzt mit FF und die Farben bleiben
                        trotzdem erhalten. Schon seltsam, manchmal.

                        Entschuldigung, daß ich die Frage im Falschen Ordner
                        gestellt hatte, ich war mir da nicht ganz sicher.
                        Günther

                        Comment


                        • #13
                          Hallo,

                          @Ornder/Unterforum: Da es (noch) keinen eigenen Berich gibt kannst du es ja nicht wissen wohin. Ich habe als Zwischenregel gestern postuliert () dass diese Fragen dann in .net Framework allgemein gestellt sollen. Aber egal - verschieben ist ja nicht der größte Aufwand...

                          Der Ansatz mit der eigenen Klasse passt schon. Wenn die Daten nur statisch angezeigt werden sollen passt auch List<T>. Andernfalls wäre ObserableCollection<T> die bessere Wahl (wegen INotifyPropertyChanged und INotifyCollectionChanged - braucht nicht alles selbst impl. werden).

                          Das ist aber auf Datenseite und diese wollen ja angezeigt werden. Daher der Vorschlag mit dem ItemsControl. Dabei werden die Daten jedoch standardmäßig mit einem Aufruf der ToString-Methode gerendert. Dass das nicht das Ziel ist ist auch klar. Daher definiere für deine Klasse ein DataTemplate (entweder direkt im ItemsControl oder als Ressource) und weise das dem ItemTemplate des ItemsControl zu.
                          Siehe auch: Data Templates (dort sind sonst auch interessante Infos)


                          mfG Gü
                          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                          Comment

                          Working...
                          X