如何将自定义 class 对象列表绑定到 Gridview 的数据源(得到 "A field or property ... not found on the ... data source")?

How can I Bind a List of custom class objects to a Gridview's Datasource (getting "A field or property ... not found on the ... data source")?

为了避免在第一次加载页面时查询数据库,我想将自定义列表 class 填充到 GridView。

我正在尝试这样做:

protected void Page_Load(object sender, EventArgs e)
{
    List<MoviesGridDisplayColumns> listStartupData = new List<MoviesGridDisplayColumns>();
    MoviesGridDisplayColumns mgdc;

    mgdc = new MoviesGridDisplayColumns();
    mgdc.MovieTitle = "War of the Buttons";
    mgdc.MPAARating = "PG";
    mgdc.IMDBRating = 7.5;
    mgdc.Minutes = 94;
    mgdc.YearReleased = "1994";
    listStartupData.Add(mgdc);

    mgdc = new MoviesGridDisplayColumns();
    mgdc.MovieTitle = "The Trip to Bountiful";
    mgdc.MPAARating = "PG";
    mgdc.IMDBRating = 7.5;
    mgdc.Minutes = 108;
    mgdc.YearReleased = "1985";
    listStartupData.Add(mgdc);

    . . .

    GridView1.DataSource = listStartupData;
    GridView1.DataBind();

...但是在倒数第二行我得到:

"System.Web.HttpException HResult=0x80004005 Message=A field or property with the name 'MovieTitle' was not found on the selected data source."

所选数据源是 MoviesGridDisplayColumns 对象列表,它确实有一个 MovieTitle 成员。那么给出了什么?

自定义class是:

public class MoviesGridDisplayColumns
{
    public string MovieTitle = string.Empty;
    public double IMDBRating = 0.0;
    public string MPAARating = string.Empty;
    public string YearReleased = string.Empty;
    public int Minutes;
}

...GridView 因此出现在 .aspx 文件中:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnDataBound="GridView1_DataBound" OnPreRender="GridView1_PreRender">
    <Columns>
        <asp:BoundField DataField="MovieTitle" HeaderText="MovieTitle" SortExpression="MovieTitle" />
        <asp:BoundField DataField="IMDBRating" HeaderText="IMDBRating" SortExpression="IMDBRating" />
        <asp:BoundField DataField="MPAARating" HeaderText="MPAARating" SortExpression="MPAARating" />
        <asp:BoundField DataField="YearReleased" HeaderText="YearReleased" SortExpression="YearReleased" />
        <asp:BoundField DataField="Minutes" HeaderText="Minutes" SortExpression="Minutes" />
    </Columns>
</asp:GridView>

您 class 中的字段缺少 getter 方法。您可以将 MoviesGridDisplayColumns 更改为以下内容。

public class MoviesGridDisplayColumns
    {
        public string MovieTitle { get; set; } = string.Empty;
        public double IMDBRating { get; set; } = 0.0;
        public string MPAARating { get; set; } = string.Empty;
        public string YearReleased { get; set; } = string.Empty;
        public int Minutes { get; set; }
    }