嵌套绑定(用DataTable做数据源)

 所谓嵌套绑定,就是一个Repeater里包含另一个Repeater控件

 

 

ItemDataBound事件:

当项被数据绑定到Repeater控件后,将引发 ItemDataBound 事件。此事件为您提供了在客户端显示数据项之前访问该数据项的最后机会。

实质上就是外层的Repeater的某条Item数据绑定完成后,该事件被触发

 

 

 

 

 

Repeater嵌套绑定的例子

 

<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">

     <ItemTemplate>

          <a href='<%# Eval("typeid","show.aspx?typeid={0}")%>'><%# Eval("typeName")%></a><br />

           <asp:Repeater ID="Repeater2" runat="server">

                  <ItemTemplate>

                       <%# Eval("title")%><br />

                   </ItemTemplate>

            </asp:Repeater>

      </ItemTemplate>

</asp:Repeater>

 

 

protected void Page_Load(object sender, EventArgs e)

{

     bindnewtype();

}

private void bindnewtype()

{

     DataTable dt = new B_newtype().Getnewtype();

     Repeater1.DataSource = dt;

     Repeater1.DataBind();

}

//注意这个方法一共会执行好几次?为什么?

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)

{

      if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)

       {

           Repeater Repeater2 = e.Item.FindControl("Repeater2") as Repeater;          

 DataRowView rowv = (DataRowView)e.Item.DataItem;//找到分类Repeater关联的数据项

            int typeid = Convert.ToInt32(rowv["typeid"]); //获取填充子类的id

            Repeater2.DataSource = new B_news().Getnew(typeid);

            Repeater2.DataBind();

         } 

 }

 

基本原理

每次repeater1的一般项模版上的新闻类别绑定完成,就会触发ItemDataBound事件,当这个事件被触发时,就应该绑定repeater2了。

ItemDataBound事件在这里共被触发4次,就是绑定了4次repeater2,每次绑定后,立刻显示所属新闻,然后进行下次再绑定repeater2,然后在新的位置显示新的新闻。

如此4次,所以新闻全部被显示出来了。

(类似于嵌套for循环)

 

 

 if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)的理解:

 

e.Item是取得事件源Repeater1的某模版项

e.Item.ItemType:是事件源Repeater1该模版项的类型

 

ItemType是个枚举,因为Repeater有多种Item类型比如(Alternating)ternatingItem,而模版的类型共有8种,Repeater有4种模版类型,gridview另有几种

 

而只有模版是一般项模版和交叉项模版,才能找到Repeater2,因为Repeater2只能被嵌套一般项和交叉项模版中

 

 

-------------------------------------------------------------------------------------------

Repeater Repeater2 = e.Item.FindControl("Repeater2") as Repeater;

为什么不是page.FindControl(Repeater2),因为Repeater2是在Repeater1的一般项模板中,一般某个嵌套控件要获取到,在他的直接“上级”里找。

 

 

 -------------------------------------------------------------------------------------------

DataRowView rowv = (DataRowView)e.Item.DataItem;的理解

e.Item.DataItemobject类型所以要转化成DataRowView

 

 

e.row.DataItem,DataRowView什么?

e.Row.DataItem数据控件(Repeater)的行数据集。
DataRowView
对应DataRow,是DataRow的视图,即临时数据行,用来操作DataRow

我们经常这样写datatable1.rows[0][name].tostring()

DataRowView 是表示控件中的一条数据,数据强制转化成DataRowView。不强制转化不能取到这项的值(注意这个用法仅仅限于数据源是datasetdatatable。泛型集合不能用)

其实要把e.Item.DataItem转换成什么类型需要看控件绑定的数据源,DataItem就是数据项,e.Item.DataItem是数据源的数据项,是object类型的

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值