62,244
社区成员




前台如下:
<body>
<form id="form1" runat="server">
<div>
</div>
<asp:DataList ID="dlImage" runat="server" OnItemDataBound="dlImageDataBound" RepeatColumns="5" RepeatDirection="Horizontal">
<ItemTemplate>
<div style="border:lpx solid black">
<br />
<asp:DataList ID="dlRelationship" runat="server" Height="126px" Width="189px">
<ItemTemplate>
<asp:Label ID="lbIT_TID" runat="server" Visible="false" Text='<%# Eval("IT_TID") %>' />
<asp:DataList ID="dlTags" runat="server" RepeatColumns="5" RepeatDirection="Horizontal" Height="93px" Width="237px">
<ItemTemplate>
<span><%# Eval ("T_Name") %>
</ItemTemplate>
</asp:DataList>
</ItemTemplate>
</asp:DataList>
<asp:Image ID="Image1" runat="server" Height="172px" ImageUrl='<%# Eval("I_Data") %>' Width="182px" />
<br /><asp:Label ID="lbImageID" runat="server" Visible="false" Text='<%# Eval("I_ID") %>' />描述:<span><%# Eval ("I_Description") %><br />作者:<span><%# Eval ("I_Creator") %><br />创作日期:<span><%# Eval ("I_CreativeDate") %><br />类型:<span><%# Eval ("I_Kind") %><br /><br /></div>
</ItemTemplate>
</asp:DataList>
</form>
</body>
后台如下:
private void BindList()
{
dlImage.DataSource = imagesSrv.GetImages();
dlImage.DataBind();
}
protected void dlImageDataBound(object sender, DataListItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
DataList dl = null;
Label labImageID = null;
dl = (DataList)e.Item.FindControl("dlRelationship");
dl.ItemDataBound += new System.Web.UI.WebControls.DataListItemEventHandler(dlRelationship_ItemDataBound);
labImageID = (Label)e.Item.FindControl("lbImageID");
string imageID = labImageID.Text.ToString();
int iImageID = Convert.ToInt32(imageID);
string commandText = "select * from IT";
commandText = commandText + " Where IT_IID=" + iImageID;
string connString = ConfigurationManager.ConnectionStrings["MyImageDataConnectionString"].ConnectionString;
SqlConnection conn = new SqlConnection();
conn.ConnectionString = connString;
conn.Open();
SqlDataAdapter myCommand = new SqlDataAdapter(commandText, conn);
DataSet ds = new DataSet();
myCommand.Fill(ds, "IT");
conn.Close();
dl.DataSource = ds.Tables["IT"];
dl.DataBind();
}
}
protected void dlRelationship_ItemDataBound(object sender, DataListItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
DataList dl = null;
Label labTagsID = null;
dl = (DataList)e.Item.FindControl("dlTags");
labTagsID = (Label)e.Item.FindControl("lbIT_TID");
string tagsID = labTagsID.Text.ToString();
int iTagsID = Convert.ToInt32(tagsID);
string commandText = "select * from IT";
commandText = commandText + " Where IT_TID=" + iTagsID;
string connString = ConfigurationManager.ConnectionStrings["MyImageDataConnectionString"].ConnectionString;
SqlConnection conn = new SqlConnection();
conn.ConnectionString = connString;
conn.Open();
SqlDataAdapter myCommand = new SqlDataAdapter(commandText, conn);
DataSet ds = new DataSet();
myCommand.Fill(ds, "Tags");
conn.Close();
dl.DataSource = ds.Tables["Tags"]; ;
dl.DataBind();
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindList();
}
}
自己做了三个表,图片表存储图片信息;标签表存储标签id和标签名;图片-标签表用来存储对应关系。
经过测试,通过外层datalist的ItemDataBound可以为第二层的dlRelationship绑定数据,但是最内层的dlTags却会失效,网上查了下后用DataListItemEventHandler任然不行,跪求大佬帮助。
每个DataList 都有ItemDataBound事件吧。分别在事件里去绑定哈
ItemDataBound这个事件是每一条数据都会进来一次?如果图片有100个,会进来一百次来查这个IT表,然后it表如果有n条数据有继续循环的查....我的天这个代码简直了......
我的建议是里把这些数据最后放到一个对象里面(不要循环的访问db,这性能太差了)
类大致是这些字段
1.图片相关的属性(页面要绑定的那些)
2.对应的Tag的list
也就不用搞这么多dataList控件了,直接
dl.DataSource = 上面已经搞好的list;
dl.DataBind();
我把你的代码跑了一下,最后的那个事件断点能进去的,你先把前端代码调整一下,然后再看吧
--下面的前端代码是指什么?
这些数据绑定都是在 dlTags里面,需要移到他的templete里
而且你下面的这些前端代码,需要放到dlTags里面吧?你看一下你的标签层级