Laden...

Verständnisprobleme mit BindingList

Erstellt von kstanger vor einem Jahr Letzter Beitrag vor einem Jahr 861 Views
K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr
Verständnisprobleme mit BindingList

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
4.931 Beiträge seit 2008
vor einem Jahr

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.

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

Das dachte ich auch, aber mit


IBindingList source = new BindingList<T>(Timings);

gibt es einen Fehler für Timings:> Fehlermeldung:

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:> Fehlermeldung:

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
16.806 Beiträge seit 2008
vor einem Jahr

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

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

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
16.806 Beiträge seit 2008
vor einem Jahr

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.

4.931 Beiträge seit 2008
vor einem Jahr

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.

16.806 Beiträge seit 2008
vor einem Jahr

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);

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

Ich habe das mal ausprobiert


IBindingList<Timing> source = new BindingList<Timing>(Timings);

und bekomme die Fehlermeldung> Fehlermeldung:

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