2005.01.01发表于blog.csdn.net/zxub
做一个歌手列表的时候,想做成按拼音首字母排序,由于歌手都放在一起,所以涉及到记录嵌套的问题,在网上找了下,发现写得不是很清楚,经过一番研究后,有了如下心得:
DataList的嵌套(先说明一下,DLOutSide表示外面的DataList,DLInner表示里面的DataList),实现原理是DLOutSide在创建的时候,动态生成DLInner,所以,DLOutSide在定义的时候,要定义一个函数,在DLOutSide创建的时候触发,也就是DLOutSide.ItemCreated所指向的函数。这里,我们假设这个函数为DLOutSideItemCreated()。在DLOutSideItemCreated()中,根据e.Item.ItemType来生成所需要的东西,if (e.Item.ItemType==ListItemType.Item) 表示当DLOutSide创建普通项,e.Item.ItemType==ListItemType.AlternatingItem就是创建交替项了。
接下来,就到重点了。DLInner的数据源根据DLOutSide.DataKeys[e.Item.ItemIndex]来得到,所以DLOutSide的DataKeys就是二者联系的关键了。DLInner由于要动态生成,所以我们要自己写个类,继承ITemplate,这就是一个模板了。建立模板的时候有个InstantiateIn(),这个就是生成模板的主要部分了,数据还要绑定,所以在InstantiateIn()中,要定义一个触发事件,在触发的事件中绑定数据。
原理讲的差不多了,这里我随便写个例子,给大家加深映象,由于是示范,写得不是很具体,具体就要靠大家了:
private void DLOutSide_ItemCreated(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
{
if (e.Item.ItemType==ListItemType.Item)
{
Literal lc=new Literal();
DataList DLInner=new DataList();
DLInner.RepeatDirection=RepeatDirection.Horizontal;
DLInner.RepeatColumns=5;
DLInner.ItemTemplate=new myTemp();//调用自定义模板
DBObject obj2=new DBObject();
obj2.SelectString="Select name from singer where initial='"+DLOutSide.DataKeys[e.Item.ItemIndex]+"'"; //这里调用了我自己写的一个数据库操作类,在前面的文章有讲过的
DLInner.DataSource=obj2.DW;
DLInner.DataBind();
e.Item.Controls.Add(DLInner);
obj2.DBClose();
}
if (e.Item.ItemType==ListItemType.AlternatingItem)
{
//这里就不多写了;
}
}
DLOutSide就到这里,下面是DLInner的自定义模板:
public class myTemp:ITemplate
{
public void InstantiateIn(System.Web.UI.Control container)
{
Literal lc=new Literal();
lc.DataBinding+=new EventHandler(this.TemplateControl_DataBinding);
container.Controls.Add(lc);
}
private void TemplateControl_DataBinding(object sender, System.EventArgs e)
{
Literal lc=(Literal)sender;//注意了,这里的lc就是上面的lc
DataListItem container=(DataListItem)lc.NamingContainer;
lc.Text+=DataBinder.Eval(container.DataItem, "name");//把name给绑定了,注意“+=”
}
}
还有些DataList的界面什么的,就把HTML代码写到模板类里就ok了,这里不多说了。
好了,就到这里。