2011-07-07 113 views
6

我有一個GridView:是否有可能綁定一個asp:GridView到列表<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> 

,我試圖設置數據源是一個List<Restitution>()其中Restitution是隻包含公共成員的公共結構;即:

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

數據綁定看起來相當無害的,太:

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

然而,拋出一個異常的DataBind()語句的不到有用的信息:

「未在所選數據源中找到名稱爲「JobNumber」的字段或屬性。「

我不明白爲什麼這不起作用;儘管大多數示例和用例似乎都使用DataSet s,但似乎應該支持實施IEnumerable的對象。有什麼特別的我必須做,讓它工作?

+0

你的代碼看起來對我來說是正確的。你確定你與正確的數據源的綁定,它不是空的或任何東西。 – Magnus

回答

11

轉換爲公共屬性的所有公共領域,它應該工作。

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

但是例外說「一個領域或財產」 – Magnus

+0

@Magnus啊,真的!我一直使用屬性。你能給物業一個鏡頭嗎?如果它不起作用,我會刪除我的答案。 –

+1

@Magnus看起來像是因爲和我一樣「信任異常所說」的詭計。事實證明它不會*顯示*以支持來自成員(甚至是公共的)的數據綁定,只有屬性... –

1

嘗試這種情況:

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

此代碼施放每個綁定行到Restitution對象,然後直接訪問JobNumber字段。如果這能起作用,您可以將其他字段同樣綁定。如果它沒有工作,錯誤應該導致你真正的問題。

1

是的,你應該能夠在這種情況下綁定列表。問題是,你需要做更多的事情是這樣的:

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

如果不工作,你可以使用TemplateColumns像這樣可能嘗試:

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

未經測試,但應該給你什麼地方去...

相關問題