GridView 与嵌套类的属性绑定
Posted
技术标签:
【中文标题】GridView 与嵌套类的属性绑定【英文标题】:GridView bound with Properties of nested class 【发布时间】:2010-11-10 22:46:38 【问题描述】:我有一个类似于下面列出的对象映射。当我尝试在 GridView 中绑定 NestedClass 的属性时,出现错误:
“在所选数据源中找不到名为“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;
【问题讨论】:
列名“NestedClass.Name”从它检索它的数据中不存在。 【参考方案1】:BoundField 列中只能显示实例的直接属性。
必须改为在 itemtemplate 中使用 DataBinder.Eval 来访问嵌套属性,而不是将其分配给 boundfield。
例子:
<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
【讨论】:
断开链接的回程机器:web.archive.org/web/20120121123301/http://iridescence.no/post/…【参考方案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);
【讨论】:
以上是关于GridView 与嵌套类的属性绑定的主要内容,如果未能解决你的问题,请参考以下文章
kotlin学习之类的修饰符与抽象类,嵌套类,内部类,匿名内部类