Entwickler-Ecke

WPF / Silverlight - Liste ObservableCollection


RobAll - Di 02.04.19 19:14
Titel: Liste ObservableCollection
Guten Abend,

ich versuch gerade eine List aus der DB zu füllen.

folgender Testansatz funktioniert:


C#-Quelltext
1:
2:
3:
4:
5:
6:
ListHersteller = new ObservableCollection<Combolisten>()
                {

                     new Combolisten(){ID=1, Hersteller="H1"}

                    ,new Combolisten(){ID=2 , Hersteller="H2"}};


die Messagebox zeigt die Daten aus der DB an


C#-Quelltext
1:
2:
3:
4:
var Hersteller_query = context.Tab_Hersteller.Select(p => new { p.ID, p.Hersteller }


foreach (var item in Hersteller_query) MessageBox.Show(item.ID + item.Hersteller);



Bei folgenden Versuchen bleibt die Liste leer.

V1

C#-Quelltext
1:
2:
3:
4:
   ListHersteller = new ObservableCollection<Combolisten>();
                {
                    foreach (var item in Hersteller_query)  new Combolisten() { ID = item.ID, Hersteller = item.Hersteller };
                }


V2

C#-Quelltext
1:
2:
 var ListHersteller = new ObservableCollection<Combolisten>();
 ListHersteller.ToList().ForEach(item => context.Tab_Hersteller.Select(p => new { p.ID, p.Hersteller }));


Wer kann mir helfen?
Danke vorab.
VG
RobAll

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


Ralf Jansen - Di 02.04.19 19:50

In V1 fehlt das Hinzufügen zur Collection via einem Aufruf von Add. Die geschweiften Klammern tun hier gar nix. Das ist so kein Initializer (man beachte das Semikolon hinter dem Construktoraufruf, danach kommt was unabhängiges). In einem Initializer könntest du auch keine Sprachkonstrukte wie z.B. Schleifen ausführen.

In V2 versuchst du über eine leere Liste zu iterieren da passiert dann natürlich auch nichts. Und mit dem ForEach würdest du nur für jedes Element in der Liste etwas tun aber keine Listenelemente erzeugen. Maximal könntest du Elemente verändern.

Du kannst aus context.Tab_Hersteller eine List von deinem Typ erstellen und die dann an den Konstruktor der ObservableCollection übergeben.
Etwa


C#-Quelltext
1:
var listHersteller = new ObservableCollection<Combolisten>(context.Tab_Hersteller.Select(p => new Combolisten() { p.ID, p.Hersteller }).ToList());                    


RobAll - Di 02.04.19 21:11

Danke für das Beispiel.
Den Fehler bekomme ich leider nicht in den Griff
Zitat:
Fehler CS1922 Der Typ "Combolisten" kann nicht mit einem Auflistungsinitialisierer initialisiert werden, da er nicht "System.Collections.IEnumerable" implementiert.

Problem bei { p.ID, p.Hersteller }

Was tun

Moderiert von user profile iconTh69: Quote- und C#-Tags hinzugefügt.
Moderiert von user profile iconTh69: Vollzitat entfernt.


Ralf Jansen - Di 02.04.19 21:25

Du musst noch die Felder/Property-Namen des Combolisten Typs hinschreiben.
Ich hatte deinen Code einfach übernommen und aus dem anonymen Typ den konkreten gemacht ohne das auch zu korrigieren.

Also Hersteller

C#-Quelltext
1:
new Combolisten() { ID = p.ID, Hersteller = p.Hersteller }                    

wenn die Felder/Properties in Combolisten so heißen und vom gleichen Typ sind wie in Tab_Hersteller.


RobAll - Di 02.04.19 22:09


C#-Quelltext
1:
ListHersteller = new ObservableCollection<Combolisten>(context.Tab_Hersteller.Select(p => new Combolisten() { ID = p.ID, Hersteller = p.Hersteller }).ToList());                    

So hats funktioniert
Danke für die Hilfe!

Moderiert von user profile iconTh69: C#-Tags hinzugefügt.
Moderiert von user profile iconTh69: Vollzitat entfernt.