我有一个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
的对象。为了让它发挥作用,我有什么特别的事情要做吗?
答案 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>
未经测试,但应该给你一个地方去......