Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中从对象列表数据绑定时如何显示子对象属性#_C#_Gridview - Fatal编程技术网

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已经在路上了。谢谢