Frage

Ich bin Bindung IList zu einem Gridview. IMyInterface sieht aus wie

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

Ich binde eine Instanz zu einem Gitter wie folgt aus:

IList<IMyInterface> instance= GetMyData();

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

Wenn binden diese an das Netz, die einzigen Elemente, die im Netz auftauchen sind die direkten Mitglieder IMyInterface. GoalStartDate und GoalEndDate

Warum ist das so? Wie erhalte ich das Raster, die Mitglieder der anderen Schnittstellen anzuzeigen erbt?

Aktualisieren Die vererbten Schnittstellen definieren einfache Daten Eigenschaften 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 wird als IMyInterface gegossen und kehrte in der Liste, die ich auf die Gridview bin verbindlich.

War es hilfreich?

Lösung

Datengebundene Steuerelemente verwendet keine Reflexion, sondern eine TypeDescriptor, um die Eigenschaften von einer Datenquelle zu erhalten. In der TypeDescriptor.GetProperties Methode können Sie das folgende lesen:

  

Die Eigenschaften für eine Komponente kann   unterscheiden sich von den Eigenschaften einer Klasse,   da die Website kann hinzufügen oder entfernen   Eigenschaften, wenn die Komponente gelegen ist.

Anscheinend ist die Implementierung standardmäßig nur zurückgeben direkte Eigenschaften von einer Schnittstelle und nicht die geerbten.

Zum Glück dieses Mechanismus ist erweiterbar, und Sie können eine Typeconverter Klasse mit benutzerdefinierten Eigenschaftsinformationen Implementierung. Bitte beachten Sie die Hinweise in der Dokumentation zur Implementierung Typeconverter Eigenschaft Logik.

Die GetProperties Implementierung der benutzerdefinierten Typeconverter-Klasse kann TypeDescriptor.GetProperties (Type) auf Ihrer Schnittstelle aufrufen und alle es geerbt Schnittstellen. Aber vielleicht könnte man sogar eine generische Typeconverter schreiben, die alle vererbten Eigenschaften unter Verwendung von Reflexion finden würden.

Dann legen Sie sich diese benutzerdefinierten Typeconverter zu Ihrer Schnittstelle mit dem Attribut Typeconverter.

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

Andere Tipps

Es ist, weil eine Schnittstelle ist ein Vertrag, und das ist der einzige Weg, mit einem Objekt zu interagieren, ist durch diesen bestimmten Vertrag. Die anderen Schnittstellen können nicht angenommen werden und kann nicht genutzt werden, bis ein gegossenes gemacht wird.

Wenn Sie also eine Liste von T zu etwas binden, wird das Datagrid nicht über die anderen Schnittstellen kennen. Und das Datagrid wird nicht Reflexion verwenden, um herauszufinden, was andere Klassen oder Schnittstellen können vererbt werden. Die einzigen Objekteigenschaften, die auf die Datenraster verfügbar sein werden sind die von der T-Schnittstelle ausgesetzt Eigenschaften.

Sie müssen Liste binden, wenn Sie die Datagrid wollen alle Eigenschaften haben Zugang zu.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top