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了,这里不多说了。
  好了,就到这里。


 posted on 2005-06-13 14:01  往事如风  阅读(765)  评论(1编辑  收藏  举报