Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Verständnisprobleme mit BindingList
kstanger
myCSharp.de - Member



Dabei seit:
Beiträge: 99

Themenstarter:

Verständnisprobleme mit BindingList

beantworten | zitieren | melden

Hallo,
obwohl ich die Doku mehrfach rauf und runter gelesen habe, verstehe ich nicht, was eine BindingList ist und wie sie aufgerufen wird.
Ich habe ein Objekt mit diversen Membern.


public class Timing
{
... Konstruktoren
}
Damit erzeuge ich eine Liste von Objekten


public List<Timing> Timings;
Nun sollte die BindingList eine Alternative zur BindingSource sein, wobei die BindingList wohl eine Teilmenge der BindingSource ist.
Was ist dann mit einem Code


IBindingList source = new BindingList<T>(datasource);
Was ist dann datasource in meinem Fall? Ich bin da komplett verwirrt.
Kann mir jemand das erklären?
Karl Stanger
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.643

beantworten | zitieren | melden

Für Windows Forms ist eine BindingSource die empfohlene Komponente, da sie speziell für die Interaktion zwischen verschiedenen Komponenten ausgelegt ist.
Eine IBindingList (bzw. BindingList<T>) ist für UI-unabhängige Klassen gedacht (sieht man auch am Namensbereich bzw. Assembly System.ComponentModel).

Und dataSource wäre in deinem Fall die Timings-Liste.
private Nachricht | Beiträge des Benutzers
kstanger
myCSharp.de - Member



Dabei seit:
Beiträge: 99

Themenstarter:

beantworten | zitieren | melden

Das dachte ich auch, aber mit


IBindingList source = new BindingList<T>(Timings);
gibt es einen Fehler für Timings:
Fehler
Konvertierung von "System.Collections.Generic.List<Ledsteuerung5.Timing>" in "System.Collections.Generic.IList<T>" nicht möglich.
Außerdem gibt es noch einen Fehler für T:
Fehler
Der Typ- oder Namespacename "T" wurde nicht gefunden (möglicherweise fehlt eine using-Directive oder ein Assemblyverweis).


using System.ComponentModel;
using System.Collection.Generic;
sind vorhanden.
Karl Stanger
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.398

beantworten | zitieren | melden

Dein Problem ist nicht die BindingList, sondern das Generics dahinter.
"T" ist in der generischen Architektur ein Platzhalter, den Du füllen musst. T bedeutet hier "irgendwas". Generics sind enorm wichtig für wieder verwendbaren, typisierten Code in .NET.
Generic classes and methods

Verstehe ich Deine Snippets hier richtig, dann wäre


IBindingList<Timing> source = new BindingList(Timings);
// oder in expliziter Form
IBindingList<Timing> source = new BindingList<Timing>(Timings);
der korrekte Syntax.

In den Docs der BindingList steht auch nirgends new BindingList<T> in den Samples, sondern zB


            listOfParts = new BindingList<Part>();


Mit Constraints auf Generics kann man das "T" weiter einschränken, zB "T muss eine Klasse sein", "T muss ein string sein", "T darf nicht null sein" etc.
Constraints on type parameters - C# Programming Guide
private Nachricht | Beiträge des Benutzers
kstanger
myCSharp.de - Member



Dabei seit:
Beiträge: 99

Themenstarter:

beantworten | zitieren | melden

Danke für die Erklärung. Hat mir viel zum Verständnis von <T> geholfen. Funktioniert mit


IBindingList source = new BindingList<Timing>(Timings);
Karl Stanger
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.398

beantworten | zitieren | melden

Offenbar nicht ganz, denn die Idee ist hier, dass das Interface den Typ auch kennt.
Daher wie bereits geschrieben:


IBindingList<Timing> source = new BindingList<Timing>(Timings);
IBindingList ist nicht das gleiche wie IBindingList<Timing>

Genauso wie
IList nicht das gleiche ist wie IList<string>

Ohne Typangabe am Interface ist alles nur als object bekannt, was weitere Castings erfordert.
Wenn man also nicht die Mechanismen von einer untypisierten Liste will, dann sollte man auch sie nicht verwenden - sondern immer immer immer die typisierte Variante.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.643

beantworten | zitieren | melden

Es wäre schön, wenn es eine generische Schnittstelle IBindingList<T> gäbe, aber BindingList<T> implementiert nur die nichtgenerische Schnittstelle IBindingList. Daher kann man also nur IBindingList oder aber BindingList<T> benutzen.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.398

beantworten | zitieren | melden

Oh, ungewöhnlich. An mir vorbei gegangen.
Dann wäre die sinnvollere Variante im Sinne der Instanziierung zumindest noch


BindingList<Timing> source = new BindingList<Timing>(Timings);
// oder in Kurzzschreibweise
BindingList<Timing> source = new(Timings);
private Nachricht | Beiträge des Benutzers
kstanger
myCSharp.de - Member



Dabei seit:
Beiträge: 99

Themenstarter:

beantworten | zitieren | melden

Ich habe das mal ausprobiert


IBindingList<Timing> source = new BindingList<Timing>(Timings);
und bekomme die Fehlermeldung
Fehler
Typ "IBindingList" ist nicht generisch und kann daher nicht mit Typargumenten verwendet werden.


BindingList<Timing> source = new BindingList<Timing>(Timings);
gibt keine Fehlermeldung und funktioniert.
Karl Stanger
private Nachricht | Beiträge des Benutzers