【问题标题】:How to bind DataTable of custom objects to GridView如何将自定义对象的 DataTable 绑定到 GridView
【发布时间】:2019-01-28 10:56:50
【问题描述】:

我有一个列表,其中包含另外两个由 Id 链接的自定义对象列表。本质上,我有一个具有许多属性的“CPDActivity”对象和一个具有更多属性的“CPDActivityExtended”对象。然后我有一个“CPDActivityComplete”对象,其中包含其他对象中的每一个。这些完整的对象被添加到填充 DataTable 的列表中。

我需要能够将此 DataTable 绑定到 GridView 并显示 CPDActivityComplete 的两个子对象的属性值。例如,“A”列下的 CPDActivityComplete.CPDActivity.A。

这是我正在尝试做的基本图片:

可视化的自定义对象列表:

到目前为止我所尝试的:

DataTables 是使用 Entity Framework 和 LINQ 填充的,我已将 GridView 绑定到生成的 DataTable:

DataTable dt = getCPDData.ToDataTable<CPDActivityComplete>(cpdActivityCompleteList);
cpd_gv_activities.DataSource = dt;
cpd_gv_activities.DataBind();

我有一个简单的 GridView 来测试:

<asp:GridView ID="cpd_gv_activities" runat="server" AutoGenerateColumns="false" AllowPaging="True" PageSize="15">
<Columns>
    <asp:TemplateField HeaderText="Full Name">
        <ItemStyle CssClass="fixedcell"></ItemStyle>
        <ItemTemplate>
            <asp:Label ID="vd_gv_lbl_FullName" runat="server" Text='<%# Bind("CPDActivity.A") %>'></asp:Label>
        </ItemTemplate>   
    </asp:TemplateField>
</Columns>

但这会导致错误:

DataBinding: 'System.String' does not contain a property with the name 'A'.

如何将 label.text 绑定到 CPDActivityExtended.CPDActivity.A 属性?

【问题讨论】:

    标签: c# asp.net gridview datatable


    【解决方案1】:

    切换到强类型的 GridView。然后您可以轻松访问所有属性和类型安全。

    所以首先将ItemType 添加到GridView

    <asp:GridView ID="cpd_gv_activities" runat="server" ItemType="YourNameSpace.CPDActivityComplete">
    

    现在您可以在 GridView 中使用 Item 并访问属性

    <asp:Label ID="vd_gv_lbl_FullName" runat="server" Text='<%# Item.A %>'></asp:Label>
    

    最后,不要转换为 DataTable(一开始就不需要),而是直接将 List 与类绑定。

    cpd_gv_activities.DataSource = cpdActivityCompleteList;
    cpd_gv_activities.DataBind();
    

    【讨论】:

    • 这正是我想要的。很好的答案,谢谢!我已经按照您的建议进行了更改,现在一切正常。
    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2014-08-13
    • 2010-10-30
    • 2014-12-22
    • 1970-01-01
    相关资源
    最近更新 更多