数据服务控件的嵌套最主要的是是内层控件数据的加载和事件的触发。 DataList嵌套的重点是要在外层DataList的ItemDataBound事件中用e.Item.FindControl方法来找到嵌套层DataList的id,编写嵌套层DataList的绑定数据源事件。下面以两层DataList为例介绍下实现的过程。效果如下图:
---------前台html代码-------
<
asp:datalist
id
="dlFileType"
RepeatColumns
="2"
runat
="server"
>
<
ItemTemplate
>
<
table
border
="0"
cellspacing
="0"
cellpadding
="0"
>
<
tr
>
<
td
width
="22%"
height
="88"
align
="center"
valign
="top"
>
<
img
src
='<%#DataBinder.Eval(Container.DataItem,
"cnvcPicURL")%
>
' width="80" height="80">
</
td
>
<
td
valign
="top"
>
<
table
width
="96%"
border
="0"
cellpadding
="0"
cellspacing
="0"
>
<
tr
width
="100%"
>
<
td
colspan
="2"
><
img
src
='<%#PageBase.strStyleRoot+"/picture/pic_fwzn_08.gif"%
>
' width="154" height="20">
<
asp:Label
id
="labFileType"
runat
="server"
Visible
=False
Text
='<%#
DataBinder.Eval(Container.DataItem,"cniFileTypeID")%
>
'>
</
asp:Label
></
td
>
</
tr
>
<
tr
>
<
td
width
="300"
>
<
asp:DataList
id
="dlFileList"
runat
="server"
RepeatColumns
="1"
Width
="100%"
>
<
ItemTemplate
>
<
TABLE
cellSpacing
="1"
cellPadding
="1"
width
="100%"
border
="0"
>
<
tr
>
<
td
width
="7%"
height
="20"
align
="center"
>
<
img
src
='<%#PageBase.strStyleRoot+"/picture/pic_fwzn_dot.gif"%
>
' width="3" height="3">
</
td
>
<
td
width
="93%"
>
<
font
color
="#393939"
>
<% #GetTitle((string)Convert.ToString(DataBinder.Eval(Container.DataItem, "cnvcTitle")),(string)Convert.ToString(DataBinder.Eval(Container.DataItem, "cnvcFileType")),(string)Convert.ToString(DataBinder.Eval(Container.DataItem, "cniBaseFileID")),(DateTime)DataBinder.Eval(Container.DataItem, "cndtPublishTime")) %>
</
font
>
</
td
>
</
tr
>
</
TABLE
>
</
ItemTemplate
>
</
asp:DataList
>
</
td
>
</
tr
>
<
tr
>
<
td
colspan
="2"
bgcolor
="E6E6E6"
height
="1"
><
img
src
='<%#PageBase.strStyleRoot+"/picture/1X1.gif"%
>
' width="1" >
</
td
>
</
tr
>
<
tr
align
="center"
>
<
td
height
="22"
colspan
="2"
><
a
href
="#"
title
="可查看到更多相关内容"
><
img
src
='<%#PageBase.strStyleRoot+"/picture/more.gif"%
>
' width="34" height="11" border="0">
</
a
></
td
>
</
tr
>
</
table
>
</
td
>
</
tr
>
</
table
>
</
ItemTemplate
>
</
asp:datalist
>
<
HTML
>
<
HEAD
>
<
title
>
NestedDataLists
</
title
>
<
meta
name
="GENERATOR"
Content
="Microsoft Visual Studio .NET 7.1"
>
<
meta
name
="CODE_LANGUAGE"
Content
="C#"
>
<
meta
name
="vs_defaultClientScript"
content
="JavaScript"
>
<
meta
name
="vs_targetSchema"
content
="http://singlepine.cnblogs.com/"
>
</
HEAD
>
<
body
MS_POSITIONING
="GridLayout"
>
<
form
id
="Form1"
method
="post"
runat
="server"
>
<
asp:DataList
runat
="server"
Id
="dlCategories"
GridLines
="Both"
Bordercolor
="black"
cellpadding
="3"
cellspacing
="0"
Headerstyle-BackColor
="#DDDDDD"
Headerstyle-Forecolor
="#777777"
Headerstyle-Font-Name
="Arial"
Headerstyle-Font-Size
="14"
Headerstyle-Font-Bold
="true"
Font-Name
="Arial"
Font-Bold
="true"
Font-Italic
="true"
Font-Size
="11"
ForeColor
="Red"
RepeatColumns
="1"
>
<
HeaderTemplate
>
省市 & 市区
</
HeaderTemplate
>
<
ItemTemplate
>

<%
# DataBinder.Eval(Container, "DataItem.province")
%>
<
br
>
<
asp:DataList
runat
="server"
Id
="ChildDataList"
GridLines
="None"
Bordercolor
="black"
cellpadding
="3"
cellspacing
="0"
Headerstyle-BackColor
="#8080C0"
Headerstyle-Font-Name
="Arial"
Headerstyle-Font-Size
="8"
Font-Name
="Arial"
Font-Size
="8"
datasource
='<%#
DataBinder.Eval(Container, "DataItem.myrelation") %
>
' RepeatColumns="5">
<
ItemTemplate
>

<%
# DataBinder.Eval(Container, "DataItem.city")
%>
</
ItemTemplate
>
</
asp:DataList
>
</
ItemTemplate
>
</
asp:DataList
>
</
form
>
</
body
>
</
HTML
>
public
class
NestedDataLists : System.Web.UI.Page

{
protected System.Web.UI.WebControls.DataList dlCategories;
private void Page_Load(object sender, System.EventArgs e)

{
string constring=System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
DataSet ds=new DataSet();
string sql1="select * from province";
SqlDataAdapter sda1 =new SqlDataAdapter(sql1,constring);
sda1.Fill(ds,"province");

string sql2="select * from city";
SqlDataAdapter sda2 =new SqlDataAdapter(sql2,constring);
sda2.Fill(ds,"city");
ds.Relations.Add("myrelation", ds.Tables["province"].Columns["provinceID"], ds.Tables["city"].Columns["father"]);
dlCategories.DataSource=ds.Tables["province"].DefaultView;
dlCategories.DataBind();
}

Web Form Designer generated code#region Web Form Designer generated code
override protected void OnInit(EventArgs e)

{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}

/**//// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()

{
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion
}

---------前台html代码-------
























<% #GetTitle((string)Convert.ToString(DataBinder.Eval(Container.DataItem, "cnvcTitle")),(string)Convert.ToString(DataBinder.Eval(Container.DataItem, "cnvcFileType")),(string)Convert.ToString(DataBinder.Eval(Container.DataItem, "cniBaseFileID")),(DateTime)DataBinder.Eval(Container.DataItem, "cndtPublishTime")) %>




















--------后台cs代码------
内层控件数据绑定与事件声明在外层的ItemDataBind中实现
private
void
dlFileType_ItemDataBound(
object
sender, System.Web.UI.WebControls.DataListItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
DataList dl = null ;
Label labTypeID = null ;
dl = (DataList)e.Item.FindControl( " dlFileList " )
labTypeID = (Label)e.Item.FindControl( " lbFileType " );
string typeID = labTypeID.Text.ToString();
int iTypeID = Convert.ToInt32(typeID);
string commandText = "select * from tbfile";
commandText = commandText + " Where TypeID=" + iTypeID;
//------------
string connString = ConfigurationSettings.AppSettings["dsn"];
SqlConnection conn = new SqlConnection();
conn.ConnectionString = connString;
conn.Open();
SqlDataAdapter myCommand = new SqlDataAdapter(commandText,conn);
DataSet ds = new DataSet();
myCommand .Fill(ds,"tbFile");
conn.Close();
//------------
dl.DataSource = ds.Tables["tbFile"];;
dl.DataBind();
}
}
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
DataList dl = null ;
Label labTypeID = null ;
dl = (DataList)e.Item.FindControl( " dlFileList " )
labTypeID = (Label)e.Item.FindControl( " lbFileType " );
string typeID = labTypeID.Text.ToString();
int iTypeID = Convert.ToInt32(typeID);
string commandText = "select * from tbfile";
commandText = commandText + " Where TypeID=" + iTypeID;
//------------
string connString = ConfigurationSettings.AppSettings["dsn"];
SqlConnection conn = new SqlConnection();
conn.ConnectionString = connString;
conn.Open();
SqlDataAdapter myCommand = new SqlDataAdapter(commandText,conn);
DataSet ds = new DataSet();
myCommand .Fill(ds,"tbFile");
conn.Close();
//------------
dl.DataSource = ds.Tables["tbFile"];;
dl.DataBind();
}
}
如果“labFileType”控件只是为了传递cniFileTypeID值,cs代码里获取typeID的代码可以改为:
int iTypeID = (int)DataBinder.Eval(e.Item.DataItem, "cniFileTypeID");
-------------------------------------------------------------------------------------------------------------------------------------------------
另一形式:
1.html代码



































2.cs代码





















































3.演示数据库/Files/singlepine/area1.rar