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

数年間、私は Web フォーム グリッドに触れていませんが、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

グリッドの列を作成し、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

また、私は通常Entity Frameworkを使用しているため、部分クラスを使用してエンティティを追加し、サブオブジェクトを掘り下げるエンティティのプロパティを定義できます。たとえば、friendはaddress.cityを返すcityプロパティを持つことができます。

于 2012-09-14T20:06:43.797 に答える
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 に答える