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?
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.
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.
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
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Danke für die Erklärung. Hat mir viel zum Verständnis von <T> geholfen. Funktioniert mit
IBindingList source = new BindingList<Timing>(Timings);
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
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);
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.