为什么转发器返回DataRowView而不是DataRow?

时间:2017-10-05 17:01:53

标签: 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; System.Data.DataRowView'输入' System.Data.DataRow'。"

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

有人能找到提到这个的MSDN文档吗?

3 个答案:

答案 0 :(得分:4)

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

DataTable's IListSource implementation会返回DefaultView,所以

repeater.DataSource = dt;

实际上相当于

repeater.DataSource = dt.DefaultView;

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

答案 1 :(得分:2)

DataRowView 封装一个DataRow,添加在网页控件上下文中非常有用的绑定功能(如中继器)。

如果您想与基础行进行交互,只需使用Row属性,如下所示:

var row = e.Item.DataItem.Row;

这可能是How can Convert DataRowView To DataRow in C#的副本。

答案 2 :(得分:0)

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 = e.Item.DataItem;
}