能否将 asp:GridView 绑定到 List<T> 上?

6

我有一个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的对象。我需要做特殊的事情来使它工作吗?

你的代码看起来对我来说是正确的。你确定你绑定了正确的数据源,而且它不是空的或其他什么问题吗? - Magnus
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
11

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

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

但是异常提示说“字段或属性”。 - Magnus
@Magnus 啊,没错!我一直都在使用属性。你能试试属性吗?如果不行的话,我会删除我的回答。 - Bala R
1
@Magnus 看起来你也像我一样被“相信异常显示”的技巧所迷惑了。事实证明,它似乎不支持从成员(即使是公共成员)进行数据绑定,只能从属性中进行。 - Rowland Shaw
在VB.NET中它可以工作:公共结构ContainerRelease 公共属性ContainerReleasesId作为整数 公共属性ContainerId作为整数 发布日期作为System.DateTime ... 结束结构 - Rodrigo T.

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>

没有测试过,但应该能给你一些方向...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,