做一個歌手列表的時候,想做成按拼音首字母排序,由於歌手都放在一起,所以涉及到記錄嵌套的問題,在網上找了下,發現寫得不是很清楚,經過一番研究後,有了如下心得:
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了,這裏不多說了。
好了,就到這裏。
關於嵌套使用DataList的心得[原創]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.