關於嵌套使用DataList的心得[原創]

  做一個歌手列表的時候,想做成按拼音首字母排序,由於歌手都放在一起,所以涉及到記錄嵌套的問題,在網上找了下,發現寫得不是很清楚,經過一番研究後,有了如下心得:
  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了,這裏不多說了。
  好了,就到這裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章