【问题标题】:How do you bind a gridview column to a subclass value?如何将 gridview 列绑定到子类值?
【发布时间】:2026-01-31 09:05:01
【问题描述】:

我有一个正在尝试绑定的 ASP.net gridview。我的 DataSource 有一个集合,我绑定的 2 个列是子类的一部分。我的 DataSource 有一个名为 Staff 的子类,其中包含员工信息。绑定字段 SurveyID 和 NumberOfExceptions 绑定良好,但无法绑定 Staff.Name 和 Staff.Office。

asp:BoundField DataField="SurveyID" HeaderText="ID" ...
asp:BoundField DataField="Staff.Name" HeaderText="Name" ...
asp:BoundField DataField="Staff.Office" HeaderText="Office" ...
asp:BoundField DataField="NumberOfExceptions" HeaderText="Exceptions" ...

而后面的代码是:

uxSurveyGrid.DataSource = searchResults;
uxSurveyGrid.DataBind();

如果我在后面的代码中键入 searchResults[0].Staff.Name 可以看到值,为什么运行时无法在 gridview 中评估 Staff.Name?

如何将列绑定到子类值?我必须在代码隐藏中做吗?

任何帮助将不胜感激,

标记。

【问题讨论】:

  • “Staff”是否有一个 getter/setter? Staff 类是否为“Name”和“Office”定义了 getter/setter。 DataBinder.Eval 的条件之一(我很确定 BoundField 用于访问数据)是为尝试检索的值定义 getter/setter。

标签: asp.net gridview


【解决方案1】:

我相信您可以使用模板字段和标记脚本来实现它...

    <asp:TemplateField>
        <ItemTemplate>
            <asp:Label Id="lblSubclassVal" runat="server" Text="<%# DataBinder.Eval(Container.DataItem, "SubClass.PropertyName")%>"></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

【讨论】:

  • 我知道这个问题已经很久没有回答了,但是如果你收到通知 - 你知道是否有办法做同样的事情,但是作为 2 路绑定,而不仅仅是一个评估?谢谢!
【解决方案2】:

ASP.NET GridView 背后的数据绑定机制仅支持一级绑定。 (相对于它的 WinForms Binding 对应物,在绑定到 DataSet / DataTable / DataView 的情况下支持多级)。

您有三种可能的解决方案:

  1. 为每一行处理 ItemDataBound 事件
  2. 使用公开子对象属性的属性扩展根级实体并将这些属性用于绑定表达式
  3. 您可以使用模板字段并使用访问数据项的 表达式生成内容,而不是使用 BoundField。

【讨论】:

    【解决方案3】:

    标记,

    我有 99.9% 的把握,您必须在各个行的 ItemDataBound 事件的代码隐藏中处理此问题。

    请记住,您可以从 e.Item.DataItem 获取整个 databould 对象

    【讨论】:

      【解决方案4】:

      BoundField 不支持 [Name].[Name] 语法。只有简单的属性名称。

      【讨论】: