Datasource an List<T> binden
-
Edit by Dravere:
Der folgende Teilbeitrag wurde bei einer Abtrennung ebenfalls entferntDravere schrieb:
@Sonnenlichtfee,
Hast du die richtige Version eingebunden? Zum Teil gibt es Probleme, wenn man die falsche DLL Version vonSystem.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 ichusing System.Data.DataDataSetExtension;
nicht einbinden.Gibts dafür noch andere Voraussetzungen, dass es eingebunden werden kann?
-
@Sonnenlichtfee,
Oh, moment, moment, mein Fehler ...Die System.Data.DataSetExtension.dll legt ihre Objekte ja im
System.Data
Namensraum ab. Es gibt keinenSystem.Data.DataSetExtension
Namensraum! Ich arbeite zu wenig mit DataSet zusammen, hatte ich gerade ganz vergessenSiehe zum Beispiel:
http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.aspxNamespace: System.Data
Assembly: System.Data.DataSetExtensions (in System.Data.DataSetExtensions.dll)Grüssli
-
@Dravere
Jetzt hab ich zumindest das eigentlich Problem gefunden - denke ich zumindestFü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?
-
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 WPFGridView
einerListView
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 einfachreturn 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 nichtBef= 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.