Datasource an List<T> binden



  • Edit by Dravere:
    Der folgende Teilbeitrag wurde bei einer Abtrennung ebenfalls entfernt

    Dravere schrieb:

    @Sonnenlichtfee,
    Hast du die richtige Version eingebunden? Zum Teil gibt es Probleme, wenn man die falsche DLL Version von System.Data.DataSetExtension einbindet. Also zum Beispiel die Version für .Net 3.5 in einem .Net 4 Projekt probiert zu verwenden.

    Edit End

    --------------------------------------

    Auf dem PC wird .Net 4 verwendet.
    Im VS wird beim Verweis die Version v4.0.30319 angegeben - eine andere kann ich auch nicht finden.
    Dennoch kann ich using System.Data.DataDataSetExtension; nicht einbinden.

    Gibts dafür noch andere Voraussetzungen, dass es eingebunden werden kann?


  • Administrator

    @Sonnenlichtfee,
    Oh, moment, moment, mein Fehler ...

    Die System.Data.DataSetExtension.dll legt ihre Objekte ja im System.Data Namensraum ab. Es gibt keinen System.Data.DataSetExtension Namensraum! Ich arbeite zu wenig mit DataSet zusammen, hatte ich gerade ganz vergessen 🙂

    Siehe zum Beispiel:
    http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.aspx

    Namespace: System.Data
    Assembly: System.Data.DataSetExtensions (in System.Data.DataSetExtensions.dll)

    Grüssli



  • @Dravere
    Jetzt hab ich zumindest das eigentlich Problem gefunden - denke ich zumindest

    Für die Klasse aus dem Entity Framework (Befund) gibt es keine CopyToDataTable() Methode. Zumindest wird dies so nicht angeboten.
    Müsste ich diese dann selbst schreiben?

    IEnumerable<Befund> test =
                        from i in context.tblbefund.AsEnumerable()
                        select i;
    
        DataTable dt = test.CopyToDataTable();
        return dt;
    

    Denn folgender Aufruf kennt die Methode dann doch (allerdings gibt es hier dann wieder ein Konvertierungsproblem)

    IEnumerable<DataRow> test =
                        from i in context.tblbefund.AsEnumerable()
                        select i;
    
        DataTable dt = test.CopyToDataTable();
        return dt;
    

    Falls selber schreiben, an was kann ich mich da orientieren, wie das aufgebaut sein soll?


  • Administrator

    Das ganze wird langsam unübersichtlich...

    Was willst du eigentlich erreichen? Du redest weiter vorne davon, dass du es an ein GridView binden möchtest. Reden wir hier von WPF?
    Möchtest du also die Resultate, welche du erhälst, in einem WPF GridView einer ListView anzeigen lassen?

    Grüssli



  • Ich möchte einen Rückgabewert erhalten, den ich übergeben kann und dann an ein DataGridView (WinForms) hängen kann.

    Bisher habe ich dazu immer eine DataTable zurück gegeben und diese dann als DataSource an das GridView gehängt.



  • An die DataGridView.DataSource-Eigenschaft kannst du doch auch direkt eine List<XXX> o.ä. dranhängen - es muß ja keine DataTable sein.
    Also in deinem Code einfach

    return test.ToList();
    

    verwenden.



  • @Th69
    Danke für den Tipp - so klappt es!

    Wenn ich allerdings nur einzelne Spalten selektieren möchte, bekommme ich schon wieder ein Konvertierungsproblem angezeigt.

    select new { i.Befund, i.Bezeichnung };
    

    Kann mir vielleicht jemand eine gute Seite zu Linq sagen oder hat jemand einen Buchtipp für mich?! Denke die Grundlagen in diesem Bereich fehlen bei mir total ...





  • Da ich nun einige Mal Probleme mit Anonymous Type hatte, wollte ich nun mal fragen, ob der Lösungsansatz soweit korrekt ist - bzw. ein kleines Problem gibt es dabei auch noch.

    Bei dieser Anweisung habe ich die Fehlermeldung bzgl. des anonymous types erhalten.

    public IEnumerable<Befund> GetBefundWithNames()
    {
        using (dbEntities db = new dbEntities())
        {
          var result = from b in db.Befund
                       join n in db.Name on b.ID equals n.BefundID
                       select new
                              {
                                  Befund = b.Bezeichnung,
                                  Name = n.Name
                              };
    
          return result;
        }
    }
    

    Um das Problem zu lösen, hab ich eine extra Klasse erstellt

    public class Befunde
    {
        public Befund Bef { get; set; }
        public Name BName  { get; set; }
    }
    

    Und dann folgende Anweisung geschrieben

    public IEnumerable<Befunde> GetBefundWithNames()
    {
        using (dbEntities db = new dbEntities())
        {
          var result = from b in db.Befund
                       join n in db.Name on b.ID equals n.BefundID
                       select new Befunde
                              {
                                  Bef= b,
                                  BName = n
                              };
    
          return result.ToList();
        }
    }
    

    Aufruf erfolgt mit

    DataGridView1.DataSource = DB.GetBefundWithNames();
    

    Erst mal die Frage, was haltet ihr grundsätzlich von der Lösung mit der eigenen Klasse? Ist das ein sauberer Lösungsansatz?

    Wenn ich die Liste nun als DataSource an meinen GridView hängen möchte, werden anstatt der Daten leider nur ProjektName.Befund bzw. ProjektName.Name
    angezeigt.
    Wie kann ich bestimmen, was angezeigt werden soll?
    Folgendes geht jedenfalls nicht

    Bef= b.Bezeichnung,
     BName = n.Name
    

    Ich danke Euch!



  • Das mit dem richtigen Anzeigen der Daten hat sich geklärt:

    public class Befunde
    {
        public string Bef { get; set; }
        public string Name { get; set; }
    }
    

    Aber weiterhin die Frage: gutes oder schlechtes Vorgehen im Umgang mit anonymous Types?



  • Was gefällt dir daran denn nicht? Außer der Variante mit dynamic (s. http://www.c-plusplus.net/forum/301608) gibt es wohl auch keinen eleganten Weg.
    Du könntest zwar ein untypisiertes IEnumerable zurückgeben, jedoch verlierst du damit m.E. alle Vorzüge der modernen .NET-Entwicklung (zu .NET 1.x Zeiten war dies ja der einzige Weg, aber daher wurden ja auch ab .NET 2.0 generics eingeführt).



  • @Th69
    Danke - wollte nur Eure Meinung dazu wissen! 🙂
    Das mit dynamic werde ich mir aber trotzdem mal noch anschauen.


Anmelden zum Antworten