是否可以将asp:GridView绑定到List <t>?</t>

时间:2011-07-07 14:45:34

标签: c# asp.net data-binding gridview

我有一个GridView:

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

我正在尝试将DataSource设置为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,但它似乎应该支持实现IEnumerable的对象。为了让它发挥作用,我有什么特别的事情要做吗?

3 个答案:

答案 0 :(得分:11)

转换公共属性的所有公共字段,它应该可以工作。

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

答案 1 :(得分: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字段。如果这样做,您可以类似地绑定其他字段。如果工作,错误应该会引导您解决实际问题。

答案 2 :(得分: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>

未经测试,但应该给你一个地方去......