GridView связан с свойствами вложенного classа
У меня есть объектная карта, подобная той, что указана ниже. Когда я пытаюсь связать свойства NestedClass в GridView, я получаю ошибку:
«Поле или свойство с именем« NestedClass.Name »не было найдено в выбранном источнике данных».
GridView привязан к объекту ObjectDataSource, и ObjectDataSource привязан к полностью заполненному экземпляру BoundClass.
- Добавление заголовка в GridView (Android)
- Создать миниатюру
- Преобразование DBContext в ObjectContext для использования с GridView
- Пейджинговые и сортировочные сетки с ASP.Net MVC
- GridView - отображать заголовки на пустом источнике данных
Есть ли способ обойти это?
Примеры classов:
public class BoundClass { public string Name { get; set; } public NestedClass NestedClass { get; set; } } public class NestedClass { public string Name { get; set; } }
- Простой пример сетки Android, использующий RecyclerView с GridLayoutManager (например, старый GridView)
- Как реализовать Yii2 Modal Dialog на кнопке просмотра и обновления Gridview?
- Как я могу экспортировать GridView.DataSource в datatable или dataset?
- как найти элемент управления в шаблоне редактирования элемента?
- Столбцы двух связанных таблиц базы данных в одном ASP.NET GridView с EntityDataSource
- GridView с двумя столбцами, шириной заливки
- как связать выпадающий список в gridview?
- ASP.NET GridView RowIndex как CommandArgument
В столбце BoundField могут отображаться только непосредственные свойства экземпляра.
Вместо этого следует использовать DataBinder.Eval в элементе itemtemplate для доступа к вложенному свойству, а не назначению его на связанное поле.
Пример:
<%#DataBinder.Eval(Container.DataItem, "NestedClass.Name")%>
Кроме того, вы можете создать собственный class, который наследует BoundField и переопределяет GetValue для использования DataBinder.Eval, как описано в этом сообщении в блоге:
Это расширение на 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); } }