2011-07-07 13 views
6

Tengo un GridView:¿Es posible enlazar un asp: GridView a una lista <T>?

<asp:GridView ID="grdRestitutions" runat="server" AutoGenerateColumns="False"> 
<Columns> 
    <asp:BoundField DataField="JobNumber" HeaderText="Job" /> 
    <asp:BoundField DataField="ContainerType" HeaderText="Type" /> 
    <asp:BoundField DataField="ReleaseDate" HeaderText="Date" /> 
    <asp:BoundField DataField="Commodity" HeaderText="Commodity" /> 
    <asp:BoundField DataField="GrossWeight" HeaderText="Weight" /> 
    <asp:BoundField DataField="SpecialInstructions" HeaderText="Special Instructions" /> 
</Columns> 
</asp:GridView> 

Que estoy tratando de establecer el origen de datos para ser una List<Restitution>() donde Restitution es una estructura pública que consiste solamente de miembros del público; es decir:

public struct Restitution 
{ 
    public int ContainerReleasesId; 
    public int ContainerId; 
    public System.DateTime ReleaseDate; 
    public int DepotId; 
    public string DepotName; 
    public string JobNumber; 
    public string BillOfLadingNumber; 
    public string BookingType; 
    public string Commodity; 
    public string SpecialInstructions; 
    public int GrossWeight; 
    public bool Confirmed; 
    public bool RecievedFlag; 
    public bool ReleaseSource; 
    public int ContainerTypeId; 
    public string InOut; 
    public string ContainerTypeDescription; 
} 

se ven los datos de unión bastante inocuo, también:

grdRestitutions.DataSource = restitutions; 
grdRestitutions.DataBind(); 

Sin embargo, se produce una excepción en la declaración DataBind() con el mensaje de menos de útiles de:

" Un campo o propiedad con el nombre 'JobNumber' no se encontró en la fuente de datos seleccionada. "

No entiendo por qué esto no funciona; mientras que la mayoría de los ejemplos y casos de uso parecen usar DataSet s, parece que debería admitir objetos que implementan IEnumerable. ¿Hay algo especial que deba hacer para permitir que funcione?

+0

Su código me parece correcto. ¿Está seguro de que su enlace con la fuente de datos correcta y no es nulo ni nada? – Magnus

Respuesta

11

Convierta todos los campos públicos para propiedades públicas y debería funcionar.

public struct ContainerRelease 
{ 
    public int ContainerReleasesId {get; set;} 
    public int ContainerId {get; set;} 
    public System.DateTime ReleaseDate {get; set;} 
    ... 
} 
+0

Pero la excepción dice "Un campo o propiedad" – Magnus

+0

@Magnus ¡Ah, cierto! Siempre he usado propiedades. ¿Puedes darles una oportunidad a las propiedades? si no funciona, borraré mi respuesta. –

+1

@Magnus parece que se enamoró del truco de "confíe en lo que dice la excepción" así como en mí. Resulta que no * aparece * para admitir el enlace de datos de los miembros (incluso los públicos), solo propiedades ... –

1

Prueba esto:

<asp:GridView ID="grdRestitutions" runat="server" AutoGenerateColumns="False"> 
<Columns> 
    <asp:templatefield headertext="Job"> 
    <itemtemplate> 
      <asp:label id="JobNumberLabel" 
      Text="<%# ((Restitution)Container.DataItem).JobNumber %>" 
      runat="server"/> 
    </itemtemplate> 
    </asp:templatefield> 
</Columns> 
</asp:GridView> 

Este código pone en cada fila unida a un objeto Restitution, luego accede al campo JobNumber directamente. Si esto funciona, puede vincular los otros campos de manera similar. Si no funciona, el error debería llevarlo al problema real.

1

Sí, debería poder enlazar la lista en este caso. Lo que pasa es que hay que hacer algo más parecido a esto:

<asp:GridView ID="grdRestitutions" runat="server" AutoGenerateColumns="False"> 
<Columns> 
    <asp:BoundField DataField="DataItem.JobNumber" HeaderText="Job" /> 
    <asp:BoundField DataField="DataItem.ContainerType" HeaderText="Type" /> 
    <asp:BoundField DataField="DataItem.ReleaseDate" HeaderText="Date" /> 
    <asp:BoundField DataField="DataItem.Commodity" HeaderText="Commodity" /> 
    <asp:BoundField DataField="DataItem.GrossWeight" HeaderText="Weight" /> 
    <asp:BoundField DataField="DataItem.SpecialInstructions" HeaderText="Special Instructions" /> 
</Columns> 
</asp:GridView> 

Si eso no funciona, usted podría tratar de usar TemplateColumns así:

<asp:GridView ID="grdRestitutions" runat="server" AutoGenerateColumns="False"> 
<Columns> 
    <asp:TemplateField HeaderText="Job" > 
    <ItemTemplate> 
     <%# DataBinder.Eval(Container, "DataItem.Job") %> 
    </ItemTemplate> 
    </asp:TemplateField> 
</Columns> 
</asp:GridView> 

No se ha probado, pero debe darle un lugar para ir ...

Cuestiones relacionadas