2017-10-05 26 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; 
} 
相關問題