datalist 是 “通过使用模板显示数据源中的项“ 的服务器控件,如果嵌套使用,对于显示层级数据是一种很好的选择,(层级数据就好像中国有很多省,省下有很多县,县里有很多乡),本篇叙述如何实现这种功能。 (也适用于嵌套datagrid&repeater)
先看下面这个例子,channels在这里是“频道”,channels下有很多columns“栏目”要显示,就好像sina.com 的“生活频道“有很多栏目,有关于男人女人等等的。
程序先创建一个datalist(id=DataList1)显示所有channels,然后在DataList1的OnItemCreated事件里判断当每一个Item 或 AlternatingItem被创建的时候,我们用程序动态生成一个datalist用来显示这个channel下的columns,在动态生成datalist的时候“显示模板“的创建很重要,在这里我们使用了ITemplate接口,自定义了myTemp显示模版,它的作用就是显示绑定的数据.
<%@ Page Language="C#" %> <%@ Import Namespace="System.Data" %> <html> <script language = "C#" runat="server"> ICollection CreateDataSource() { DataTable dt = new DataTable(); DataRow dr; dt.Columns.Add(new DataColumn("StringValue", typeof(string))); for (int i = 0; i < 10; i++) { dr = dt.NewRow(); dr[0] = "Channels " + i.ToString(); dt.Rows.Add(dr); } DataView dv = new DataView(dt); return dv; } ICollection CreateDataSource2(int i) { DataTable dt = new DataTable(); DataRow dr; if(i<0) i = 0; dt.Columns.Add(new DataColumn("StringValue", typeof(string))); for(int m=0;m<5;m++) { dr = dt.NewRow(); dr[0] = "Channel" + i.ToString() + "__Columns" + m.ToString(); dt.Rows.Add(dr); } DataView dv = new DataView(dt); return dv; } void Page_Load(Object sender, EventArgs e) { if (!IsPostBack) { DataList1.DataSource = CreateDataSource(); DataList1.DataBind(); } } private void DataList1_ItemCreated(object sender, System.Web.UI.WebControls.DataListItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem ) { DataList dl = new DataList (); dl.ItemTemplate = new myTemp () ; dl.DataSource = CreateDataSource2(e.Item.ItemIndex ); dl.DataBind (); e.Item.Controls.Add (dl); } } public class myTemp : ITemplate { static int itemcount; public void InstantiateIn(System.Web.UI.Control container) { Literal lc = new Literal(); lc.Text = "<TR><TD>"; lc.DataBinding += new EventHandler(TemplateControl_DataBinding); itemcount += 1; container.Controls.Add(lc); } private void TemplateControl_DataBinding(object sender, System.EventArgs e) { Literal lc; lc = (Literal) sender; DataListItem container = (DataListItem ) lc.NamingContainer; lc.Text += DataBinder.Eval(container.DataItem, "StringValue"); lc.Text += "</TD></TR>"; } } </script> <body> <form runat=server>
<h3>DataList Example</h3> <asp:DataList id="DataList1" runat="server" BorderColor="black" CellPadding="3" Font-Name="Verdana" RepeatLayout="Table" RepeatColumns="5" GridLines="Both" BorderWidth = 1 RepeatDirection="Horizontal" Font-Size="8pt" OnItemCreated="DataList1_ItemCreated" > <SelectedItemStyle Font-Bold="True" ForeColor="#F7F7F7" BackColor="#738A9C"></SelectedItemStyle>
<HeaderStyle BackColor="#aaaadd"> </HeaderStyle>
<AlternatingItemStyle BackColor="Gainsboro"> </AlternatingItemStyle>
<HeaderTemplate>
Channels
</HeaderTemplate> <ItemTemplate> <%# DataBinder.Eval(Container.DataItem, "StringValue") %> </ItemTemplate> </asp:DataList> <p> <hr noshade align="left" width="300px"> </form> <br><a href="mailto:[email protected]">mailto:[email protected]</a><br> </body> </html> 
|