2011-07-07 9 views
6

Ben bir GridView var: Ben olmak DataSource ayarlamak çalışıyorumBir asp: GridView bir Listeyi <T> listesine bağlamak mümkün mü?

<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> 

bir Restitution sadece kamu üyelerinden oluşan bir kamu yapıdır List<Restitution>(); yani:

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

veriler de oldukça zararsız görünüyor bağlayıcı:

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

Ancak bir istisna daha az yararlı mesajla DataBind() ekstresinde atılır:

" Seçilen veri kaynağında 'JobNumber' adını taşıyan bir alan veya özellik bulunamadı. "

Bunun neden çalışmadığını anlamıyorum; Çoğu örnekte ve kullanım durumlarındas kullanılıyor gibi görünmekle birlikte, IEnumerable'u uygulayan nesneleri desteklemesi gerektiği görülmektedir. Çalışmasına izin vermek için yapmam gereken özel bir şey var mı?

+0

Kodunuz bana uygun görünüyor. Doğru veri kaynağıyla bağlandığınızdan ve boş veya hiç bir şey olmadığından emin misiniz? – Magnus

cevap

11

Tüm ortak alanları herkese açık mülkler için dönüştürür ve çalışması gerekir.

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

Ancak istisna "Bir alan veya özellik" – Magnus

+0

@Magnus Ah, doğru diyor! Ben her zaman özellikleri kullandım. Emlaklara bir şans verebilir misin? eğer işe yaramazsa, cevabımı silerim. –

+1

@Magnus, "istisnanın ne dediğine güven" in yanı sıra benim için de düştüğünüze benziyor. Görünüşe göre, * üye * (sadece kamuya açık olanlar) üyelerin veri bağlayıcısını desteklemek için * görünmez… –

1

bu deneyin:

<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> 

Bu kod sonra doğrudan JobNumber alanını erişmesi üzerine Restitution nesneye her bağlanmış satır düşürdü. Bu çalışırsa, diğer alanları benzer şekilde bağlayabilirsiniz. , çalışmazsa, hata sizi gerçek sorunlara götürmelidir.

1

Evet, bu durumda listeyi bağlayabilmeniz gerekir.

<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> 

test ama gitmek size bir yere vermelidir değil: o muhtemelen şöyle TemplateColumns kullanarak deneyebilirsiniz işe yaramazsa

<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> 

: şey bunun gibi daha fazla şeyler yapmak gerek olduğunu ...