34 votes

GridView lié avec des propriétés de classe imbriquée

J'ai une carte d'objets similaire à ce qui est indiqué ci-dessous. Lorsque j'essaie de lier les propriétés de NestedClass dans une GridView, j'obtiens l'erreur:

«Un champ ou une propriété portant le nom« NestedClass.Name »est introuvable sur la source de données sélectionnée.»

Le GridView est lié à un ObjectDataSource et le ObjectDataSource est lié à une instance entièrement remplie de BoundClass.

Y a-t-il un moyen de contourner cela?

Exemples de cours:

 public class BoundClass
{
    public string Name { get; set; }
    public NestedClass NestedClass { get; set; }
}

public class NestedClass
{
    public string Name { get; set; }
}
 

54voto

Evan Points 1318

Seulement les propriétés d'une instance peut être affiché dans un BoundField colonne.

On doit plutôt utiliser DataBinder.Eval dans un itemtemplate pour accéder à la propriété nested au lieu de l'affecter à un boundfield.

Exemple:

<asp:TemplateField>
    <itemtemplate>
        <p><%#DataBinder.Eval(Container.DataItem, "NestedClass.Name")%></p>
    </itemtemplate>
</asp:TemplateField>

Alternativement, vous pouvez créer une classe qui hérite de BoundField et remplace GetValue à utiliser DataBinder.Eval, comme décrit dans ce post de blog:

http://iridescence.no/post/FixingBoundFieldSupportforCompositeObjects.aspx

10voto

Sjoerd Points 34671

Cette extension sur BoundField appelle DataBinder.Eval() , qui prend en charge les propriétés imbriquées:

 public class BetterBoundField : BoundField
{
    protected override object GetValue(Control controlContainer)
    {
        if (DataField.Contains("."))
        {
            var component = DataBinder.GetDataItem(controlContainer);
            return DataBinder.Eval(component, DataField);
        }
        return base.GetValue(controlContainer);
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X