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>
本文地址:http://com.8s8s.com/it/it45982.htm