【问题标题】:Bind ASP.NET 2.0 GridView to my own IList<T>.SomeMemberOfMyOwnCustomType.SomeProperty将 ASP.NET 2.0 GridView 绑定到我自己的 IList<T>.SomeMemberOfMyOwnCustomType.SomeProperty
【发布时间】:2012-09-17 04:20:02
【问题描述】:

假设我有这样的数据:

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. 好友名(列标题:好友名)
  2. 城市(列标题:城市)
  3. 年龄(列标题:年龄)

我该怎么做?

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

【问题讨论】:

    标签: c# asp.net gridview


    【解决方案1】:

    几年来我不接触 webforms 网格,但 IIRC 你可以在网格一侧使用&lt;Columns&gt; 表示法:

    <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 });
    

    并为此新输出创建一个类似的&lt;Columns&gt; 表示法,您还需要为自定义的标题文本使用它。

    编辑:如果 DateField="Address.City" 不起作用,可以使用 templateField 选项,使用 &lt;ItemTemplate&gt; 您可以在其内容中简单地使用 &lt;%# Eval("Address.City") %&gt;

    【讨论】:

      【解决方案2】:

      类似这样的:

      <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 and Business Objects

      【讨论】:

        【解决方案3】:

        您还可以为网格创建列并将它们映射到 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 的城市属性。

        【讨论】:

          猜你喜欢
          • 2015-04-04
          • 1970-01-01
          • 2011-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多