Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么中继器返回DataRowView而不是DataRow?_C#_Asp.net - Fatal编程技术网

C# 为什么中继器返回DataRowView而不是DataRow?

C# 为什么中继器返回DataRowView而不是DataRow?,c#,asp.net,C#,Asp.net,它引发异常“无法将'System.Data.DataRowView'类型的对象强制转换为'System.Data.DataRow'类型。” DataRow是DataTable的一个元素,但是为什么e.Item.DataItem会变成DataRowView 有人能找到提到这一点的MSDN文档吗?DataRowView封装了一个DataRow,添加了在web控件上下文中有用的绑定功能(如中继器) 如果要与基础行交互,只需使用行属性,如下所示: protected void Page_Load(obj

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

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


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

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

如果要与基础行交互,只需使用
属性,如下所示:

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;
}

这可能是的副本。

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

返回,所以

实际上相当于

repeater.DataSource = dt;

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

我不确定为什么它会这样做,可能是因为repeater生成了
DataRowView
对象。显然,使用
varrow=((DataRowView)e.Item.DataItem).row
将解决此问题。不确定为什么要获取DataRowView—这是DataRow的自定义版本,但您可以将其用作DataRow—我不是问如何,我是问为什么
repeater.DataSource = dt.DefaultView;
repeater.DataSource = dt.DefaultView;
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;
}