GridView связан со свойствами вложенного класса - PullRequest
33 голосов
/ 15 июля 2009

У меня есть карта объектов, аналогичная приведенной ниже. Когда я пытаюсь связать свойства 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; }
}

Ответы [ 2 ]

53 голосов
/ 28 июля 2009

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

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

Пример:

<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

10 голосов
/ 09 ноября 2011

Это расширение в 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);
    }
}
...