C# 在C中从对象列表数据绑定时如何显示子对象属性#
好的,让我们想象我有一个这样的物体:C# 在C中从对象列表数据绑定时如何显示子对象属性#,c#,gridview,C#,Gridview,好的,让我们想象我有一个这样的物体: public class User { public int ID { get; set; } public String Name { get; set; } public String Surname { get; set; } public String Description { get; set; } public Location Location { get; set; } } gvUsers.Data
public class User {
public int ID { get; set; }
public String Name { get; set; }
public String Surname { get; set; }
public String Description { get; set; }
public Location Location { get; set; }
}
gvUsers.DataSource = getUsers(); // This returns a List<User> collection.
gvUsers.DataBind();
<asp:GridView ID="gvUsers" runat="server" AutoGenerateColumns="False" >
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" />
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:TemplateField HeaderText="Surname">
<ItemTemplate>
<asp:Label ID="lbSurname" runat="server" Text='<%# Eval("Surname") %>'></asp:Label>
<asp:HiddenField ID="hdnUserId" runat="server" Value='<%# DataBinder.Eval(Container.DataItem, "ID") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
public class User {
public int ID { get; set; }
public String Name { get; set; }
public String Surname { get; set; }
public String Description { get; set; }
public Location Location { get; set; }
public String LocationPost {get{return Location.Post;}}
}
请注意,最后一个属性是位置类型对象。让我们看看Location对象:
public class Location {
public String ID { get; set; }
public String Address { get; set; }
public String PostCode { get; set; }
}
现在,我想在gridview中显示一个用户列表,但我不想用datareader或任何数据对象提供它,而是想使用一个用户列表集合,因此我调用了一个方法,该方法为我提供一个列表集合,并对gridview进行数据绑定,如下所示:
public class User {
public int ID { get; set; }
public String Name { get; set; }
public String Surname { get; set; }
public String Description { get; set; }
public Location Location { get; set; }
}
gvUsers.DataSource = getUsers(); // This returns a List<User> collection.
gvUsers.DataBind();
<asp:GridView ID="gvUsers" runat="server" AutoGenerateColumns="False" >
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" />
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:TemplateField HeaderText="Surname">
<ItemTemplate>
<asp:Label ID="lbSurname" runat="server" Text='<%# Eval("Surname") %>'></asp:Label>
<asp:HiddenField ID="hdnUserId" runat="server" Value='<%# DataBinder.Eval(Container.DataItem, "ID") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
public class User {
public int ID { get; set; }
public String Name { get; set; }
public String Surname { get; set; }
public String Description { get; set; }
public Location Location { get; set; }
public String LocationPost {get{return Location.Post;}}
}
gvUsers.DataSource=getUsers();//这将返回一个列表集合。
gvUsers.DataBind();
现在,我使用了一些BoundFields和Templatefields来显示数据,它可以正常工作,如下所示:
public class User {
public int ID { get; set; }
public String Name { get; set; }
public String Surname { get; set; }
public String Description { get; set; }
public Location Location { get; set; }
}
gvUsers.DataSource = getUsers(); // This returns a List<User> collection.
gvUsers.DataBind();
<asp:GridView ID="gvUsers" runat="server" AutoGenerateColumns="False" >
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" />
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:TemplateField HeaderText="Surname">
<ItemTemplate>
<asp:Label ID="lbSurname" runat="server" Text='<%# Eval("Surname") %>'></asp:Label>
<asp:HiddenField ID="hdnUserId" runat="server" Value='<%# DataBinder.Eval(Container.DataItem, "ID") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
public class User {
public int ID { get; set; }
public String Name { get; set; }
public String Surname { get; set; }
public String Description { get; set; }
public Location Location { get; set; }
public String LocationPost {get{return Location.Post;}}
}
如果我尝试访问Location对象属性,就会出现问题,请在template字段中想象一下:
<asp:HiddenField ID="hdnLocationName" runat="server" Value='<%# DataBinder.Eval(Container.DataItem, "Location.PostCode") %>' />
那不行。
我不知道是否有办法使用模板字段来显示它。我还想知道是否有一种使用BoundField的方法
如果仅使用前端无法完成,可以在gridView数据绑定的后端完成吗?我是否应该使用LINQ并在select上设置它?该选项适用。简言之,如果您想这样绑定到用户的属性,您必须将Postcode设置为用户的属性
给出了德米特定律的一个很好的例子。您可以做的最好的事情就是添加一个属性,该属性仅从
位置中提取值。大概是这样的:
public class User {
public int ID { get; set; }
public String Name { get; set; }
public String Surname { get; set; }
public String Description { get; set; }
public Location Location { get; set; }
}
gvUsers.DataSource = getUsers(); // This returns a List<User> collection.
gvUsers.DataBind();
<asp:GridView ID="gvUsers" runat="server" AutoGenerateColumns="False" >
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" />
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:TemplateField HeaderText="Surname">
<ItemTemplate>
<asp:Label ID="lbSurname" runat="server" Text='<%# Eval("Surname") %>'></asp:Label>
<asp:HiddenField ID="hdnUserId" runat="server" Value='<%# DataBinder.Eval(Container.DataItem, "ID") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
public class User {
public int ID { get; set; }
public String Name { get; set; }
public String Surname { get; set; }
public String Description { get; set; }
public Location Location { get; set; }
public String LocationPost {get{return Location.Post;}}
}
更干净的解决方案是重写位置中的ToString方法来表示描述。我本来以为不必这样做,但正如GrandMasterFlush所说,Demeter已经在路上了。谢谢