2017-10-05 61 views
3
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“。”为什么中继器返回DataRowView而不是DataRow?

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

任何人都可以找到提到这一点的MSDN文档?

+0

我不知道为什么事情正在做它做的事,也许是因为中继器产生'DataRowView'对象。显然,使用'var row =((DataRowView)e.Item.DataItem).Row;'会解决这个问题。 – dasblinkenlight

+0

不知道为什么你会得到DataRowView - 这是DataRow的自定义版本,但你可以将它作为DataRow使用 - https://stackoverflow.com/questions/17089147/a-way-to-get-a-datarow -from-datarowview –

回答

4

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

DataTable's IListSource implementation返回DefaultView,所以

repeater.DataSource = dt; 

实际上相当于

repeater.DataSource = dt.DefaultView; 

类型默认视图的是DataView,这是一个DataRowView的集合。这就是为什么你的数据项是DataRowView对象。

2

DataRowView封装一个DataRow,加入结合的功能,是在Web控件(如中继器)的上下文中是有用的。

如果你想与底层行进行交互,只要使用属性,像这样:

var row = e.Item.DataItem.Row; 

这是How can Convert DataRowView To DataRow in C#可能重复。

+0

我不是问如何,我问为什么 – Gqqnbig

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; 
} 
相关问题