现在的位置: 首页 > 综合 > 正文

ASP.net的ItemDataBound事件与LinqToSql数据源关于e.Item.DataItem的类型

2014年02月17日 ⁄ 综合 ⁄ 共 1398字 ⁄ 字号 评论关闭

一、不管是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;
                }
            }
        }

两种方法,没有好坏之分!你喜欢什么酒用什么。

 

注释图:

 

 

 

抱歉!评论已关闭.