如何将自定义对象的DataTable绑定到GridView
How to bind DataTable of custom objects to GridView
我有一个列表,其中包含另外两个通过 ID 链接的自定义对象列表。本质上,我有一个 'CPDActivity' 对象,它有很多属性,还有一个 'CPDActivityExtended' 对象,还有更多。然后我有一个 'CPDActivityComplete' 对象,其中包含每个其他对象。这些完整的对象被添加到一个列表中,该列表就是填充数据表的内容。
我需要能够将此 DataTable 绑定到 GridView 并显示 CPDActivityComplete 的两个子对象的属性值。例如 CPDActivityComplete.CPDActivity.A 在 'A' 列下。
这是我正在尝试做的事情的基本描述:
显示的自定义对象列表:
到目前为止我尝试过的:
数据表是使用 Entity Framework & LINQ 填充的,我已将 GridView 绑定到生成的数据表:
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 属性?
切换到强类型的 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>
最后,不要转换为数据表(一开始不需要),而是直接将列表与 class 绑定。
cpd_gv_activities.DataSource = cpdActivityCompleteList;
cpd_gv_activities.DataBind();
我有一个列表,其中包含另外两个通过 ID 链接的自定义对象列表。本质上,我有一个 'CPDActivity' 对象,它有很多属性,还有一个 'CPDActivityExtended' 对象,还有更多。然后我有一个 'CPDActivityComplete' 对象,其中包含每个其他对象。这些完整的对象被添加到一个列表中,该列表就是填充数据表的内容。
我需要能够将此 DataTable 绑定到 GridView 并显示 CPDActivityComplete 的两个子对象的属性值。例如 CPDActivityComplete.CPDActivity.A 在 'A' 列下。
这是我正在尝试做的事情的基本描述:
显示的自定义对象列表:
到目前为止我尝试过的:
数据表是使用 Entity Framework & LINQ 填充的,我已将 GridView 绑定到生成的数据表:
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 属性?
切换到强类型的 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>
最后,不要转换为数据表(一开始不需要),而是直接将列表与 class 绑定。
cpd_gv_activities.DataSource = cpdActivityCompleteList;
cpd_gv_activities.DataBind();