Domanda

Sto legando IList a GridView.Assomiglia a IMyInterface

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

Lego un'istanza a una griglia in questo modo:

IList<IMyInterface> instance= GetMyData();

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

Quando lo si associa alla griglia, gli unici membri visualizzati nella griglia sono i membri diretti di IMyInterface:GoalStartDate e GoalEndDate.

Perché?Come posso fare in modo che la griglia visualizzi i membri delle altre interfacce che eredita?

AggiornamentoLe interfacce ereditate definiscono semplici proprietà dei dati come

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

Esiste una classe che implementa IMyInterface:

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

}

Questi vengono espressi come IMyInterface e restituiti nell'elenco che sto vincolando a GridView.

È stato utile?

Soluzione

I controlli associati ai dati non utilizzano la riflessione ma un TypeDescriptor per ottenere le proprietà da un'origine dati.Nel TypeDescriptor.GetProperties metodo, puoi leggere quanto segue:

Le proprietà per un componente possono differire dalle proprietà di una classe, poiché il sito può aggiungere o rimuovere le proprietà se il componente è situato.

Apparentemente l'implementazione predefinita restituirà solo le proprietà dirette da un'interfaccia e non quelle ereditate.

Fortunatamente questo meccanismo è estensibile e puoi scrivere a TypeConverter classe con implementazione delle informazioni sulle proprietà personalizzate.Fare riferimento alle osservazioni nella documentazione di TypeConverter per l'implementazione della logica delle proprietà.

L'implementazione GetProperties della tua classe TypeConverter personalizzata può chiamare TypeDescriptor.GetProperties(Type) sulla tua interfaccia e su tutte le sue interfacce ereditate.Ma forse potresti anche scrivere un TypeConverter generico che trovi tutte le proprietà ereditate utilizzando la riflessione.

Quindi alleghi questo TypeConverter personalizzato alla tua interfaccia con l'attributo TypeConverterAttribute.

E poi, come per magia, l'origine dati troverà tutte le proprietà.;-)

Altri suggerimenti

E 'a causa di un interfaccia è un contratto, e questo è l'unico modo per interagire con un oggetto è attraverso quel contratto specifico. Le altre interfacce non possono essere assunti e non possono essere utilizzati finché non viene effettuata una colata.

Quindi, quando si associa un elenco di T a qualcosa, il datagrid non sa di quelle altre interfacce. E il datagrid non ha intenzione di utilizzare la riflessione per capire che cosa altre classi o interfacce possono essere ereditate. Le uniche proprietà dell'oggetto che stanno per essere a disposizione del datagrid sono le proprietà esposte dall'interfaccia T.

È necessario legare lista se si desidera che il datagrid per avere accesso a tutte le proprietà.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top