Question

Je suis à un liant IList GridView. IMyInterface ressemble

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

Je lie une instance à un réseau comme celui-ci:

IList<IMyInterface> instance= GetMyData();

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

Quand lier cela à la grille, les seuls membres qui apparaissent dans la grille sont les membres directs de IMyInterface. GoalStartDate et GoalEndDate

Pourquoi? Comment puis-je obtenir la grille pour afficher les membres des autres interfaces héritées?

Mise à jour Les interfaces héritées définissent les propriétés de données simples comme

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

Il y a une classe qui implémente 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; }

}

Ils sont coulés en IMyInterface, et sont retournés dans la liste que je suis liaison au GridView.

Était-ce utile?

La solution

Les données contrôles liés ne pas utiliser la réflexion, mais un TypeDescriptor pour obtenir les propriétés d'une source de données. Dans le TypeDescriptor.GetProperties méthode, vous pouvez lire ce qui suit:

  

Les propriétés d'un composant peut   diffèrent des propriétés d'une classe,   parce que le site peut ajouter ou supprimer   si les propriétés sont situées le composant.

Apparemment, l'implémentation par défaut renvoie uniquement des propriétés directes d'une interface et non celles héritées.

Heureusement, ce mécanisme est extensible, et vous pouvez écrire un TypeConverter classe avec la mise en œuvre de l'information de propriété personnalisée. S'il vous plaît se référer aux remarques de la documentation TypeConverter pour la mise en œuvre logique de la propriété.

La mise en œuvre GetProperties de votre classe TypeConverter personnalisé peut appeler TypeDescriptor.GetProperties (type) sur votre interface et tous ses interfaces héritées. Mais vous pourriez peut-être même écrire un TypeConverter générique qui trouverait toutes les propriétés héritées en utilisant la réflexion.

Ensuite, vous attachez ce TypeConverter personnalisé à votre interface avec l'attribut TypeConverterAttribute.

Et puis, comme par magie, la source de données trouverez toutes les propriétés. ; -)

Autres conseils

Il est parce qu'une interface est un contrat, et qui est la seule façon d'interagir avec un objet est par ce contrat spécifique. Les autres interfaces ne peuvent pas être pris en charge et ne peuvent pas être utilisés jusqu'à ce que le plâtre est faite.

Ainsi, lorsque vous liez une liste de T à quelque chose, le DataGrid ne connaît pas les autres interfaces. Et le DataGrid ne va pas utiliser la réflexion pour comprendre ce que les autres classes ou interfaces peuvent être héritées. Les seules propriétés d'objet qui vont être à la disposition du DataGrid sont les propriétés exposées par l'interface T.

Vous devez lier la liste si vous voulez le DataGrid d'avoir accès à toutes les propriétés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top