ASP.net的ItemDataBound事件與LinqToSql資料來源關於e.Item.DataItem的型別
阿新 • • 發佈:2019-01-26
CSDN廣告是越來越多了,所有部落格筆記不再更新,新網址 DotNet筆記
一、不管是Repeater還是ListView控制元件,e.Item.DataItem總是習慣性的出現。那麼e.Item.DataItem是什麼?
他代表了當前正在被“處理”的行。這個“行”只包含資料,不包含控制元件。什麼意思呢?如下:
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="LinqDataSource1" OnItemDataBound="Repeater1_ItemDataBound"> <HeaderTemplate> <table> </HeaderTemplate> <ItemTemplate> <tr> <td> <%#Eval("part_code") %> </td> <td> <asp:TextBox ID="TextBox1" runat="server" Text='<%#Eval("stock_num") %>'></asp:TextBox> </td> </tr> </ItemTemplate> <FooterTemplate> </table></FooterTemplate> </asp:Repeater>
注:以上程式碼,資料庫中的表名稱為 tbl_stock_dtl
就是說e.Item.DataItem只包含part_code,stock_num這樣的資料欄位,不包含類似TextBox等控制元件。因此,我們可以在ItemDataBound事件裡面通過把e.Item.DataItem轉換為相應的型別來獲取ItemTemplate裡當前對應的資料值,然後進行一些“目的性”的處理。
但是,因為我們使用資料來源的種類不同,所以e.item.DataItem轉換的型別也變得不唯一。
1、使用DataSet繫結資料來源時,用
DataRowView view = (DataRowView)e.Item.DataItem; var stock_Row=(XXX.XXX.tbl_stock_dtlRow)view.Row; if(stock_Row.stock_num>0) { XXXXX; }
個人不太喜歡這種方式!
2、使用LinqToSql
大家都知道,在Linq的.dbml檔案中,編譯器把表對映為一個類,其中每條記錄就是一個類物件。如下程式碼,如果庫存(stock_num)為0,就把textBox的邊框變紅。
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) { if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem)//判斷行的型別。 { tbl_stock_dtl drvRow= (tbl_stock_dtl)e.Item.DataItem;//把行裡面的資料轉換為dbml檔案中類的相應物件 if (drvRow.stock_num==00) { TextBox tb = (TextBox)e.Item.FindControl("TextBox1");//模板中的控制元件不能直接通過ID查詢,切記。 tb.BorderColor = System.Drawing.Color.Red; } } }
兩種方法,沒有好壞之分!你喜歡什麼酒用什麼。
註釋圖: