Подтвердить что ты не робот

GridView связан с свойствами вложенного класса

У меня есть карта объектов, похожая на приведенную ниже. Когда я пытаюсь связать свойства NestedClass в GridView, я получаю ошибку:

"Поле или свойство с именем" NestedClass.Name "не было найдено в выбранном источнике данных."

GridView привязан к объекту ObjectDataSource, а ObjectDataSource привязан к полностью заполненному экземпляру BoundClass.

Есть ли способ обойти это?

Примеры классов:

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

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

Ответ 1

В столбце BoundField могут отображаться только непосредственные свойства экземпляра.

Вместо этого необходимо использовать DataBinder.Eval в элементе itemTemplate для доступа к вложенному свойству, а не назначению его в поле границы.

Пример:

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

В качестве альтернативы вы можете создать собственный класс, который наследует BoundField и переопределяет GetValue для использования DataBinder.Eval, как описано в этом сообщении в блоге:

http://web.archive.org/web/20120121123301/http://iridescence.no/post/FixingBoundFieldSupportforCompositeObjects.aspx

Ответ 2

Это расширение на BoundField вызывает DataBinder.Eval(), которое поддерживает вложенные свойства:

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