c# - 为什么中继器返回的是 DataRowView 而不是 DataRow?

标签 c# asp.net

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 接口(interface)允许类“自定义”提供给 Repeater 等数据绑定(bind)控件的数据。

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/

相关文章:

c# - 您如何从C#中以编程方式调用 “Document Format”?

c# - 按下按钮后如何使数字出现在文本框中?

c# - 你能通过windows连接到Linux上的MySQL数据库吗

c# - ASP.NET MVC (Razor) 与 Angular 5

asp.net - 如何在长时间请求处理期间保持 ASP.NET session ?

asp.net - 在没有 Request 对象的情况下获取 asp.net 服务器和应用程序 url

c# - 如何在 C# 中从 aspx.cs 页面设置多行按钮文本?

c# - 在 asp.net 中从客户端 (Javascript) 刷新 GridView

c# - 在页面加载时从 .aspx 中删除下拉项

mysql - ASP.NET如何在div中显示sqldatasource行?