Pergunta

Estou ligação IList a um GridView. IMyInterface parece com

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

eu ligar uma instância para uma grade como esta:

IList<IMyInterface> instance= GetMyData();

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

Ao vincular este à rede, os únicos membros que aparecem na grade são os membros diretos de IMyInterface:. GoalStartDate e GoalEndDate

Por que isso? Como faço para obter a grade para exibir os membros das outras interfaces ela herda?

Atualizar As interfaces herdadas definir propriedades de dados simples como

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

Há uma classe 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; }

}

Estas são lançados como IMyInterface, e voltou na lista que eu estou ligação ao GridView.

Foi útil?

Solução

Os dados vinculados controles não usar a reflexão, mas um TypeDescriptor para obter as propriedades de uma fonte de dados. No método TypeDescriptor.GetProperties , você pode ler o seguinte:

As propriedades para uma lata componente diferem das propriedades de uma classe, porque o site pode adicionar ou remover Propriedades se o componente está situada.

Aparentemente, a implementação padrão só irá retornar propriedades diretos a partir de uma interface e não aqueles herdados.

Felizmente este mecanismo é extensível, e você pode escrever uma TypeConverter classe com a implementação de informações de propriedade personalizada. Por favor, consulte as observações contidas na documentação TypeConverter para implementar a lógica de propriedade.

O GetProperties implementação de sua classe TypeConverter personalizado pode chamar TypeDescriptor.GetProperties (Natureza) em sua interface e tudo que é herdado interfaces. Mas talvez você pode até escrever um TypeConverter genérico que iria encontrar todas as propriedades herdadas usando reflexão.

Em seguida, você anexar este TypeConverter personalizado para sua interface com o atributo TypeConverterAttribute.

E então, como mágica, a fonte de dados vai encontrar todas as propriedades. ; -)

Outras dicas

É porque uma interface é um contrato, e essa é a única maneira de interagir com um objeto é através desse contrato específico. As outras interfaces não pode ser assumido e não pode ser utilizado até que um molde é feito.

Assim, quando você vincular uma lista de T a algo, o datagrid não sabe sobre as outras interfaces. E o datagrid não vai usar o reflexo para descobrir o que as outras classes ou interfaces pode ser herdada. As únicas propriedades de objetos que vão estar disponíveis para o datagrid são as propriedades expostas pela interface T.

Você precisa ligar lista se quiser que o datagrid para ter acesso a todas as propriedades.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top