我稍微更新了一些遗留的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>
,那么就没有错误。只有在调用数据绑定表达式时才会出现异常。
答案 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
绑定到它时,我收到了该错误。