嵌套使用 datalist

datalist 是 “通过使用模板显示数据源中的项“ 的服务器控件,如果嵌套使用,对于显示层级数据是一种很好的选择,(层级数据就好像中国有很多省,省下有很多县,县里有很多乡),本篇叙述如何实现这种功能。 (也适用于嵌套datagrid&repeater)

先看下面这个例子,channels在这里是“频道”,channels下有很多columns“栏目”要显示,就好像sina.com 的“生活频道“有很多栏目,有关于男人女人等等的。

程序先创建一个datalist(id=DataList1)显示所有channels,然后在DataList1的OnItemCreated事件里判断当每一个Item 或 AlternatingItem被创建的时候,我们用程序动态生成一个datalist用来显示这个channel下的columns,在动态生成datalist的时候“显示模板“的创建很重要,在这里我们使用了ITemplate接口,自定义了myTemp显示模版,它的作用就是显示绑定的数据.

1@ Page Language="C#" 
1@ Import Namespace="System.Data" 
 1<html>
 2<script language="C#" runat="server">   
 3  
 4ICollection CreateDataSource()   
 5{   
 6DataTable dt = new DataTable();   
 7DataRow dr;   
 8  
 9dt.Columns.Add(new DataColumn("StringValue", typeof(string)));   
10  
11for (int i = 0; i < 10; i++)   
12{   
13dr = dt.NewRow();   
14dr[0] = "Channels " + i.ToString();   
15dt.Rows.Add(dr);   
16}   
17  
18DataView dv = new DataView(dt);   
19return dv;   
20}   
21  
22ICollection CreateDataSource2(int i)   
23{   
24DataTable dt = new DataTable();   
25DataRow dr;   
26if(i<0) i = 0;   
27  
28dt.Columns.Add(new DataColumn("StringValue", typeof(string)));   
29  
30for(int m=0;m<5;m++)   
31{   
32dr = dt.NewRow();   
33dr[0] = "Channel" + i.ToString() + "__Columns" + m.ToString();   
34dt.Rows.Add(dr);   
35}   
36  
37DataView dv = new DataView(dt);   
38return dv;   
39}   
40  
41void Page_Load(Object sender, EventArgs e)   
42{   
43if (!IsPostBack)   
44{   
45DataList1.DataSource = CreateDataSource();   
46DataList1.DataBind();   
47}   
48}   
49  
50private void DataList1_ItemCreated(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)   
51{   
52if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem )   
53{   
54DataList dl = new DataList ();   
55dl.ItemTemplate = new myTemp () ;   
56dl.DataSource = CreateDataSource2(e.Item.ItemIndex );   
57dl.DataBind ();   
58e.Item.Controls.Add (dl);   
59}   
60}   
61public class myTemp : ITemplate   
62{   
63static int itemcount;   
64public void InstantiateIn(System.Web.UI.Control container)   
65{   
66Literal lc = new Literal();   
67lc.Text = "<TR><TD>";   
68lc.DataBinding += new EventHandler(TemplateControl_DataBinding);   
69itemcount += 1;   
70container.Controls.Add(lc);   
71}   
72private void TemplateControl_DataBinding(object sender, System.EventArgs e)   
73{   
74Literal lc;   
75lc = (Literal) sender;   
76DataListItem container = (DataListItem ) lc.NamingContainer;   
77lc.Text += DataBinder.Eval(container.DataItem, "StringValue");   
78lc.Text += "</TD></TR>";   
79}   
80}   
81</script>
82<body>
83<form runat="server">
84<h3>DataList Example</h3>
85<asp:datalist bordercolor="black" borderwidth="1" cellpadding="3" font-name="Verdana" font-size="8pt" gridlines="Both" id="DataList1" onitemcreated="DataList1_ItemCreated" repeatcolumns="5" repeatdirection="Horizontal" repeatlayout="Table" runat="server">
86<selecteditemstyle backcolor="#738A9C" font-bold="True" forecolor="#F7F7F7"></selecteditemstyle>
87<headerstyle backcolor="#aaaadd">
88</headerstyle>
89<alternatingitemstyle backcolor="Gainsboro">
90</alternatingitemstyle>
91<headertemplate>
92
93Channels 
94
95</headertemplate>
96<itemtemplate>   

DataBinder.Eval(Container.DataItem, "StringValue")

1</itemtemplate>
2</asp:datalist>
3<p>
4<hr align="left" noshade="" width="300px"/>
5</p></form>
6<br/><a href=" mailto:[email protected]">mailto:[email protected]</a><br/>
7</body>
8</html>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus