无法将数据表绑定到强类型的GridView

时间:2017-05-17 10:35:43

标签: asp.net data-binding webforms

我稍微更新了一些遗留的webform代码,并且正在更新旧的DataGrid以使用更新的GridView,这样我就可以使用强类型的模型绑定。定制的DataTable以编程方式绑定到GridView:

MyCustomCollectionType data = GetFromDataSource();
MyGridView.DataSource = data;
MyGridView.DataBind();

,webform看起来像:

<asp:GridView runat="server" ID="MyGridView" ItemType="MyCustomCollectionType.MyCustomRow">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <%#: Item.ID %> : <%#: Item.Name %>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

但由于某种原因,当调用DataBind()时,我得到以下异常:

[InvalidCastException: Unable to cast object of type 'System.Data.DataRowView' to type 'MyCustomRow'.]
   ASP.Test_aspx.__DataBind__control54(Object sender, EventArgs e) in D:\Bit\MyRepo\MyProject\Test.aspx:130
   System.Web.UI.Control.OnDataBinding(EventArgs e) +84
   System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +150
   System.Web.UI.Control.DataBind() +17
   System.Web.UI.Control.DataBindChildren() +185
   System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +160
   System.Web.UI.Control.DataBind() +17
   System.Web.UI.Control.DataBindChildren() +185
   System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +160
   System.Web.UI.Control.DataBind() +17
   System.Web.UI.Control.DataBindChildren() +185
   System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +160
   System.Web.UI.Control.DataBind() +17
   System.Web.UI.WebControls.GridView.CreateRow(Int32 rowIndex, Int32 dataSourceIndex, DataControlRowType rowType, DataControlRowState rowState, Boolean dataBind, Object dataItem, DataControlField[] fields, TableRowCollection rows, PagedDataSource pagedDataSource) +167
   System.Web.UI.WebControls.GridView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding) +3721
   System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable data) +67
   System.Web.UI.WebControls.GridView.PerformDataBinding(IEnumerable data) +14
   System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data) +128
   System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +34
   System.Web.UI.WebControls.DataBoundControl.PerformSelect() +143
   System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +74
   System.Web.UI.WebControls.GridView.DataBind() +9

如果我添加OnRowDataBound事件处理程序并检查RowType,我可以看到它将数据绑定Header确定,但只要它遇到实际的DataRow,抛出异常。如果我完全删除数据绑定表达式,只是将静态文本放入,那么异常消失,我得到预期的静态文本行数。

那么我怎么能弄清楚出了什么问题呢?

更新

有趣的是,如果我使用<asp:BoundField DataField="ID" /><asp:BoundField DataField="Name" />代替<asp:TemplateField>,那么就没有错误。只有在调用数据绑定表达式时才会出现异常。

1 个答案:

答案 0 :(得分:1)

您正在将DataTable绑定到期望绑定List的GridView。可以使用this example中的GridView,也可以不使用ItemType属性并使用Eval进行数据绑定。

public class SalesPerson
{
    public string SalesPersonID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

List<SalesPerson> salesFolks = new List<SalesPerson>()

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

<asp:GridView ID="GridView1" runat="server" ItemType="SalesPerson">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <%# Item.FirstName %>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

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

<asp:GridView ID="GridView1" runat="server">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <%#: Eval("FirstName") %>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

当我尝试第一个GridView示例,并尝试将DataTable绑定到它时,我收到了该错误。