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; }
}
Ответы
Ответ 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);
}
}