10

Ich binde IList an eine GridView. IMyInterface sieht aus wieBinding IList <IMyInterfaceType> zeigt keine Mitglieder von Interfaces an, die IMyInterface erbt

public interface IMyInterface: IHasTotalHours, IHasLines 
{ 
    DateTime GoalStartDate { get; set; } 
    DateTime GoalEndDate { get; set; } 
} 

ich eine Instanz zu einem Gitter wie diese binden:

IList<IMyInterface> instance= GetMyData(); 

myGrid.DataSource = instance; 
myGrid.DataBind(); 

Wenn diese an das Gitter binden, sind die einzigen Elemente, die die direkte Mitglieder von IMyInterface im Netz auftauchen: GoalStartDate und GoalEndDate.

Warum ist das? Wie bekomme ich das Raster, um die Mitglieder der anderen Schnittstellen anzuzeigen, die es erbt?

aktualisieren Die vererbten Schnittstellen definieren einfache Dateneigenschaften wie

public interface IHasTotalHours 
{ 
    string Description { get; set; } 
    int Hours{ get; set; } 
} 
public interface IHasLines 
{ 
    double TotalLines { get; set; } 
    double LinesPerHour { get; set; } 
} 

Es ist eine Klasse, die IMyInterface implementiert:

public class MyClass : IMyInterface 
{ 
    public string Description { get; set; } 
    public int Hours { get; set; } 
    public double TotalLines { get; set; } 
    public double LinesPerHour { get; set; } 
    public DateTime GoalStartDate { get; set; } 
    public DateTime GoalEndDate { get; set; } 

} 

Diese werden als IMyInterface gegossen und kehrte in der Liste, die Ich bin an die GridView gebunden.

+0

Was ist die Definition für IHasTotalHours, IHasLines, IHasGoals? – shahkalpesh

+0

Wie sieht die Klasse, die IMyInterface implementiert, aus? – shahkalpesh

Antwort

5

Datengebundene Steuerelemente verwenden keine Reflektion, sondern einen TypeDescriptor, um die Eigenschaften aus einer Datenquelle abzurufen.

Die Eigenschaften für eine Komponente kann unterscheiden sich von den Eigenschaften einer Klasse, , da die Website kann Eigenschaften, wenn die Komponente Benachbart ist hinzuzufügen oder zu entfernen: Im TypeDescriptor.GetProperties Methode können Sie das folgende lesen.

Anscheinend wird die Standardimplementierung nur direkte Eigenschaften von einer Schnittstelle und nicht die geerbten zurückgeben.

Zum Glück ist dieser Mechanismus erweiterbar, und Sie können eine TypeConverter Klasse mit benutzerdefinierten Eigenschafteninformationen implementieren. Beachten Sie die Hinweise in der TypeConverter-Dokumentation zur Implementierung der Eigenschaftslogik.

Die GetProperties-Implementierung Ihrer benutzerdefinierten TypeConverter-Klasse kann TypeDescriptor.GetProperties (Type) auf Ihrer Schnittstelle und allen ihren geerbten Schnittstellen aufrufen. Aber vielleicht könnten Sie sogar einen generischen TypeConverter schreiben, der alle vererbten Eigenschaften durch Reflektion findet.

Dann fügen Sie diesen benutzerdefinierten TypeConverter an Ihre Schnittstelle mit dem TypeConverterAttribute-Attribut an.

Und dann, wie Magie, findet die Datenquelle alle Eigenschaften. ;-)

+0

Ausgezeichnet. Das ist sehr hilfreich. Danke vielmals! – jlembke

+1

Der Vollständigkeit halber bezieht sich TypeConverter hauptsächlich auf Dinge wie PropertyGrid; Für Raster ist es üblich, ITypesList oder TypeDescriptionProvider - oder manchmal (weniger häufig) ICustomTypeDescriptor (auf dem 0. Element) - aber selten TypeConverter. –

0

Es ist, weil eine Schnittstelle ein Vertrag ist, und das ist die einzige Möglichkeit, mit einem Objekt durch diesen spezifischen Vertrag zu interagieren. Die anderen Schnittstellen können nicht angenommen werden und können nicht verwendet werden, bis eine Umwandlung erfolgt ist.

Wenn Sie also eine Liste von T an etwas binden, weiß das Datagrid nichts über diese anderen Schnittstellen. Und das Datagrid wird keine Reflektion verwenden, um herauszufinden, welche anderen Klassen oder Schnittstellen möglicherweise vererbt werden. Die einzigen Objekteigenschaften, die für das Datagrid verfügbar sind, sind die Eigenschaften, die von der T-Schnittstelle verfügbar gemacht werden.

Sie müssen List binden, wenn das DataGrid Zugriff auf alle Eigenschaften haben soll.

+0

Aber wenn irgendeine Klasse, die IMyInterface implementiert, die Mitglieder der anderen Schnittstellen auch implementieren muss, bekomme ich nicht, warum diese Mitglieder nicht auch sichtbar sind. Dir nicht zu widersprechen. In der IDE, wenn ich den Mauszeiger über die Instanz bewege, werden nur die unmittelbaren Mitglieder angezeigt. Ich muss weiter graben, um den Rest zu sehen. – jlembke

+0

Sie sagen also, dass diese Instanz List sein sollte, nicht IList? Ich werde das am Morgen probieren. – jlembke

+0

Es macht keinen Unterschied, ob es sich um eine Liste oder IList handelt. Es ist der TYP, der zählt. Der IMyInterface-Typ macht NUR zwei Eigenschaften verfügbar. Das Datagrid kann unmöglich über die anderen wissen, da es einen IMyInterface-Typ erhält. –