protected void Page_Load(object sender, System.EventArgs e)
{
    DataTable dt = GetDataTable("select * from AccountTypes");

    repeater.DataSource = dt;
    repeater.DataBind();
}

private void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType != ListItemType.Item) {
        return;
    }

    var row = (DataRow)e.Item.DataItem;
}


它引发异常“无法将类型为'System.Data.DataRowView'的对象强制转换为类型为'System.Data.DataRow'的对象。”

DataRow是DataTable的元素,但是为什么e.Item.DataItem成为DataRowView?

谁能找到提及此的MSDN文档?

最佳答案

此行为由DataTable类定义。与典型的收集类不同,DataTable实现IListSource而不是IEnumerable。 IListSource接口允许类“自定义”提供给数据绑定控件(如Repeater)的数据。

DataTable's IListSource implementation返回DefaultView,所以

repeater.DataSource = dt;


实际上等于

repeater.DataSource = dt.DefaultView;


DefaultView的类型为DataView,它是DataRowView集合。这就是为什么您的数据项是DataRowView对象的原因。

关于c# - 为什么转发器返回DataRowView而不是DataRow?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46591143/

10-10 13:29