c# - llenar - Vincular ASP.NET 2.0 GridView a mi propio IList<T>.SomeMemberOfMyOwnCustomType.SomeProperty
gridview asp.net c# sql server (3)
Digamos que tengo datos como estos:
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; }
}
Digamos que unir un control GridView de ASP.NET 2.0 a mi propia IList de esta forma:
GridView1.DataSource = new List<Friend>
{
new Friend { Name = "...", Age = 22, ... }
};
GridView1.DataBind();
Pero quiero tener solo las siguientes columnas en mi GridView con los siguientes subtítulos personalizados / encabezados de columna:
- FriendName (Título de columna: nombre de amigo)
- Ciudad (Título de la columna: Ciudad)
- Edad (Título de columna: Edad)
¿Cómo puedo hacer eso?
En otras palabras, ¿cómo puedo vincular un control GridView a un miembro personalizado de mi propio IList personalizado de forma selectiva?
Algo como esto:
<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>
Comprueba esto: ASP.NET: GridView y Business Objects
Hace unos años que no toco las cuadrículas de webforms pero IIRC puede hacerlo en el lado de la cuadrícula, usando la notación <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>
o use las extensiones IEnumerable / Linq para transformar sus resuls de la siguiente manera:
GridView.DataSource = friends.Select(friend =>
new { FriendName, City = friend.Address.City, Age });
y cree una notación <Columns>
similar para esta nueva salida, también la necesitará para el texto personalizado.
EDITAR: En caso de que DateField = "Address.City" no funcione, existe la opción templateField, con <ItemTemplate>
puede simplemente <%# Eval("Address.City") %>
en su contenido.
También puede crear las columnas para su grilla y asignarlas en su código en su page_load, llamar a la subrutina generateColumns y luego, una vez que haya terminado, invoque un enlace. GenerateColumns podría verse así:
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
Además, normalmente utilizo el marco Entity y entonces la entidad se puede agregar a usar una clase parcial y luego puedo definir una propiedad en la entidad que profundiza en subobjetos. Por ejemplo, un amigo puede tener una propiedad de la ciudad que devuelva address.city.