10

Estoy vinculando IList a un GridView. IMyInterface pareceEncuadernación IList <IMyInterfaceType> no muestra los miembros de Interfaces que IMyInterface hereda

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

Ato una instancia a una red de la siguiente manera:

IList<IMyInterface> instance= GetMyData(); 

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

Cuando enlazar este a la red, los únicos miembros que aparecen en la red son los miembros directos de IMyInterface: GoalStartDate y GoalEndDate.

¿Por qué es eso? ¿Cómo hago para que la grilla muestre los miembros de las otras interfaces que hereda?

Actualizar Las interfaces heredadas definen las propiedades de datos simples como

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

Hay una clase que 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; } 

} 

Estos se presentan como IMyInterface y devueltos en la lista que Estoy vinculando a GridView.

+0

¿Cuál es la definición de IHasTotalHours, IHasLines, IHasGoals? – shahkalpesh

+0

Además, ¿cómo se ve la clase que implementa IMyInterface? – shahkalpesh

Respuesta

5

Los controles vinculados a datos no usan la reflexión, sino un TypeDescriptor para obtener las propiedades de una fuente de datos. En el método TypeDescriptor.GetProperties, se puede leer lo siguiente:

Las propiedades de un componente pueden diferir de las propiedades de una clase, porque el sitio puede agregar o quitar propiedades si el componente está situada.

Aparentemente, la implementación predeterminada solo devolverá las propiedades directas de una interfaz y no las heredadas.

Afortunadamente este mecanismo es extensible, y puede escribir una clase TypeConverter con implementación de información de propiedad personalizada. Consulte los comentarios en la documentación de TypeConverter para implementar la lógica de propiedad.

La implementación GetProperties de su clase TypeConverter personalizada puede llamar a TypeDescriptor.GetProperties (Type) en su interfaz y todas sus interfaces heredadas. Pero tal vez incluso podría escribir un TypeConverter genérico que encontraría todas las propiedades heredadas mediante el uso de la reflexión.

A continuación, conecte este TypeConverter personalizado a su interfaz con el atributo TypeConverterAttribute.

Y luego, como magia, la fuente de datos encontrará todas las propiedades. ;-)

+0

Excelente. Eso es muy útil. ¡Muchas gracias! – jlembke

+1

Para completar, TypeConverter se aplica principalmente a cosas como PropertyGrid; para las grillas, es más común usar ITypesList o TypeDescriptionProvider, o algunas veces (menos común) ICustomTypeDescriptor (en el 0 ° elemento), pero rara vez TypeConverter. –

0

Es porque una interfaz es un contrato, y esa es la única forma de interactuar con un objeto es a través de ese contrato específico. Las otras interfaces no se pueden suponer y no se pueden utilizar hasta que se realice un lanzamiento.

Así que cuando vincula una Lista de T a algo, la cuadrícula de datos no conoce esas otras interfaces. Y la cuadrícula de datos no va a usar la reflexión para descubrir qué otras clases o interfaces podrían heredarse. Las únicas propiedades de objeto que estarán disponibles para la cuadrícula de datos son las propiedades expuestas por la interfaz T.

Debe enlazar List si desea que la cuadrícula de datos tenga acceso a todas las propiedades.

+0

Pero si cualquier clase que implementa IMyInterface tiene que implementar también los miembros de las otras interfaces, no entiendo por qué esos miembros tampoco son visibles. No estoy en desacuerdo contigo En el IDE cuando estoy sobre la instancia, solo me muestra a los miembros inmediatos. Tengo que cavar más para ver el resto. – jlembke

+0

Entonces, ¿está diciendo que la instancia debe ser List , no IList? Voy a dar un tiro por la mañana. – jlembke

+0

No hace la diferencia si es una Lista o IList. Es el TIPO lo que importa. El tipo IMyInterface expone SOLAMENTE dos propiedades. La cuadrícula de datos no puede conocer los demás porque se le ha dado un tipo de IMyInterface. –

Cuestiones relacionadas