所谓嵌套绑定,就是一个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.DataItem是object类型所以要转化成DataRowView
e.row.DataItem,DataRowView什么?
e.Row.DataItem数据控件(Repeater)的行数据集。
DataRowView对应DataRow,是DataRow的视图,即临时数据行,用来操作DataRow的
我们经常这样写datatable1.rows[0][“name“].tostring()
DataRowView 是表示控件中的一条数据,数据强制转化成DataRowView。不强制转化不能取到这项的值(注意这个用法仅仅限于数据源是dataset、datatable。泛型集合不能用)
其实要把e.Item.DataItem转换成什么类型需要看控件绑定的数据源,DataItem就是数据项,e.Item.DataItem是数据源的数据项,是object类型的