4

假设我有这样的数据:

class Location
{
    public int Id { get; private set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Country { get; set; }
}

class Friend
{
    public int Id { get; }
    public string FriendName { get; set; }
    public Location Address { get; set; }
    public int Age { get; set; }
    public bool IsReliable { get; set; }
}

假设我将一个 ASP.NET 2.0 GridView 控件绑定到我自己的 IList,如下所示:

GridView1.DataSource = new List<Friend>
{
    new Friend { Name = "...", Age = 22, ... }
};

GridView1.DataBind();

但我想在我的 GridView 中只有以下列具有以下自定义标题/列标题:

  1. FriendName(列标题:朋友姓名)
  2. 城市(列标题:城市)
  3. 年龄(列标题:年龄)

我怎么做?

换句话说,如何选择性地将 GridView 控件绑定到我自己的自定义 IList 的自定义成员?

4

3 回答 3

5

几年来我没有接触网络表单网格,但 IIRC 你可以在网格侧使用<Columns>符号来做到这一点:

<asp:GridView ...>
    <Columns>
      <asp:BoundField DataField="FriendName"
        readonly="true"      
        headertext="Friend Name"/>
      <asp:BoundField DataField="Address.City"
        readonly="true"      
        headertext="City"/>
      <asp:BoundField DataField="Age"
        readonly="true"      
        headertext="Age"/>
    </Columns>
</asp:GridView>

或使用 IEnumerable/Linq 扩展来转换您的结果,如下所示:

GridView.DataSource = friends.Select(friend => 
     new { FriendName, City = friend.Address.City, Age });

并为这个新输出创建一个类似的<Columns>符号,您还需要这个用于自定义的标题文本。

编辑:如果 DateField="Address.City" 不起作用,则有 templateField 选项,<ItemTemplate>您可以简单地<%# Eval("Address.City") %>在其内容中。

于 2012-09-14T19:46:57.577 回答
1

像这样的东西:

<asp:GridView ID="FriendGridView" runat="server" AutoGenerateColumns="false"> 
    <Columns> 
        <asp:BoundField HeaderText="Friend Name" 
            DataField="FriendName" SortExpression="FriendName" /> 
        <asp:BoundField HeaderText="Age" 
            DataField="Age" SortExpression="Age" /> 
        <asp:BoundField HeaderText="City"  
            DataField="Address.City" SortExpression="Address.City" /> 
    </Columns> 
</asp:GridView>

检查这个:ASP.NET:GridView 和业务对象

于 2012-09-14T20:04:47.730 回答
1

您还可以为网格创建列并将它们映射到 page_load 的代码中,调用 generateColumns 子例程,然后在完成后调用绑定。GenerateColumns 可能如下所示:

Private Sub GenerateContactGridColumns()
    Dim clmName As New BoundField()
    clmName.DataField = "FriendName"
    clmName.HeaderText = "Name"

    Dim clmCity As New BoundField()
    clmCity.DataField = "City"
    clmCity.HeaderText = "City"

    Dim clmEdit As New CommandField()
    clmEdit.ButtonType = ButtonType.Image
    clmEdit.EditImageUrl = Me.ThemeImagesPath & "/edit.gif"
    clmEdit.DeleteImageUrl = Me.ThemeImagesPath & "/delete.gif"
    clmEdit.ShowEditButton = True
    clmEdit.ShowDeleteButton = True

    gvContacts.Columns.Clear()
    gvContacts.Columns.Add(clmName)
    gvContacts.Columns.Add(clmCity)
    gvContacts.Columns.Add(clmEdit)
End Sub

另外,我通常使用实体框架,因此可以使用部分类将实体添加到实体中,然后我可以在实体中定义一个深入研究子对象的属性。例如,朋友可以有一个返回 address.city 的城市属性。

于 2012-09-14T20:06:43.797 回答