zoukankan      html  css  js  c++  java
  • 关于嵌套使用DataList的心得[原创]

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


  • 相关阅读:
    CF1082E Increasing Frequency
    CF1083B The Fair Nut and String
    week2
    CF1082G Petya and Graph
    后缀数组学习笔记
    单纯形法
    验证rbd的缓存是否开启
    如何删除一台OSD主机
    Mon失效处理方法
    查询osd上的pg数
  • 原文地址:https://www.cnblogs.com/zxub/p/173589.html
Copyright © 2011-2022 走看看