首先理解实现方法,rpt可以实现从库中去出的数据,自定义布局,常见的栏目排版大致是这样:
1,栏目1
2,栏目2
3,栏目3
这是常见的rpt使用,但做论坛板块就要细分到子版块,那格式就有所不同。
1,栏目1
1,栏目1-子栏目1
1,栏目2-子栏目2
2,栏目2
2,栏目1-子栏目12,栏目2-子栏目2
要达到这样的效果就要使用到RPT嵌套。
大致说一下数据库设计方式,简单的设计,不说的特别复杂。首先有普通栏目的一些信息,ID字段,还有是否子栏目的字段,父级栏目
的ID标识等等。根据自己设计情况定夺,设计好之后就开始大致布局一下上面的板块;
我设计的界面大致图。
代码如下:
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
< div class ="Star_bbsFrame" >
< div class ="Star_bbs_Top" > 社区公告: </ div >
< asp:Repeater ID ="RepeaterForFristList" runat ="server"
onitemdatabound ="RepeaterForFristList_ItemDataBound" >
< ItemTemplate >
< div class ="Star_bbs_One" >
< a > <% # DataBinder.Eval(Container.DataItem, " StarTitle " ) %> </ a >
</ div >
< asp:Repeater ID ="RepeaterForSedList" runat ="server" >
< ItemTemplate >
< div class ="Star_B_O_BD" >
< div class ="Star_B_O_one" >
< div class ="Star_B_O_ImgF" >
< a href ="/star_list_<%#Eval(" ID") % > "> < img src ="<%# DataBinder.Eval(Container.DataItem, " StarImg")% > " alt=" <% # DataBinder.Eval(Container.DataItem, " StarTitle " ) %> " /> </ a >
</ div >
< div class ="Star_B_O_TextF" >
< div class ="Star_B_O_T_Title" >< a href ="/star_list_<%#Eval(" ID") % > "> <% # DataBinder.Eval(Container.DataItem, " StarTitle " ) %> </ a > (今日: < span style ="color:#FF6600; font-weight:normal;" > <% #pa.GetStarIDReturnTodayBBs(Convert.ToInt32( Eval ( " ID " ))) %> </ span > ) </ div >
< div class ="Star_B_O_T_text" > <% # DataBinder.Eval(Container.DataItem, " Dis " ) %> </ div >
</ div >
</ div >
< div class ="Star_B_O_HF" >< span > <% #pa.GetStarIDReturnMainBBs(Convert.ToInt32( Eval ( " ID " ))) %> </ span > / <% #pa.GetStarIDReturnAllBBs(Convert.ToInt32( Eval ( " ID " ))) %> </ div >
< div class ="Star_B_O_T_LastHF" >
< div class ="Star_B_O_T_BBSTitle" >< a href ="/star_<%#pa.GetStarIDReturnlastbbsinfo(Convert.ToInt32(Eval(" ID"))).ID% > "> <% #pa.GetStarIDReturnlastbbsinfo(Convert.ToInt32( Eval ( " ID " ))).BBsTitle %> </ a ></ div >
< div class ="Star_B_O_T_BBSArter" > 作者: <% #pa.GetName(Convert.ToInt32(pa.GetStarIDReturnlastbbsinfo(Convert.ToInt32( Eval ( " ID " ))).MyNumber)) %> - <% #pa.DateDiff(Convert.ToDateTime(pa.GetStarIDReturnlastbbsinfo(Convert.ToInt32( Eval ( " ID " ))).CreateTime)) %> </ div >
</ div >
</ div >
</ ItemTemplate >
</ asp:Repeater >
</ ItemTemplate >
</ asp:Repeater >
</ div >
在代码中的RPT控件RepeaterForFristList(顶级板块)中再次使用了一个RPT控件RepeaterForSedList,这样就达到了我们想要
的基本效果,然后把论坛板块的基本字段信息填写好,就可以了。
具体绑定方法:
首先将表层的RPT绑定,大家应该都会;
RepeaterForFristList.DataBind();
然后绑定里层子RPT绑定,首先要从表层获取到一些表层的基本字段,比如ID项,这就是为什么要在数据库设计时要多建立一个父级
ID字段,来区分我的子RPT绑定的是哪个板块下面的栏目。
protected void RepeaterForFristList_ItemDataBound( object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Repeater rptProduct = (Repeater)e.Item.FindControl( " RepeaterForSedList " );
// 找到分类Repeater关联的数据项
DataRowView rowv = (DataRowView)e.Item.DataItem;
// 提取分类ID
int CategorieId = Convert.ToInt32(rowv[ " ID " ]);
// 根据分类ID查询该分类下的板块,并绑定板块Repeater
rptProduct.DataSource = starmainobj.GetListInfo( 10 , "" , " Starcolumn= " + CategorieId + " and Recommend=0 " , " Starorder asc " );
rptProduct.DataBind();
}
}
Repeater rptProduct = (Repeater)e.Item.FindControl("RepeaterForSedList");
自定义 RPT控件 绑定到 RepeaterForSedList 中,因为此时的的子集RPT是一个集合;
上面的绑定代码中,int CategorieId = Convert.ToInt32(rowv["ID"]);获取到父级栏目字段ID后,进行绑定;
运行一下看效果:
论坛中我顺便也在后台做了一个简单的管理的功能,这样方便首页显示调用:
基本达到了仿一些社区版块的设计方式,还可以利用这种方法做贴吧回复,文章回复的列表信息;
这种也就是RPT嵌套做出来的嘛,效果还是相当不错的噢!
希望可以和大家更多交流一下。