由于项目的需要,需要使用.net来处理。痛苦的是,以前学的东西都忘光了,这回重新拾起,问题一大堆啊,不过还好,简单的问题还是应付得不错,怎么说呢,此次的处女作自我还算满意,但还需很大的提高。
好了,先说一下这回碰上的问题吧。
要遍历一个栏目表,一个数据表的数据,按照某种格式(如图1)排列。

图1
其中,“最近加盟”与“热门站点推荐”为栏目表中的数据,点击进去之后显示所有对应的数据。在这里,需要先把所有的栏目遍历出来,然后再遍历相应栏目中在数据表中的部分数据出来。之前的做法是:
< asp:DataList id="catalogList" runat="server" DataKeyField="classID">
< ItemTemplate>
< asp:DataList id="itemList" runat="server" repeatcolumns="5">
< HeaderTemplate>
< %# DataBinder.Eval(((DataListItem)Container.Parent.Parent).DataItem,"CatalogName")%>
< /HeaderTemplate>
< ItemTemplate>
< img src="< %#DataBinder.Eval(Container.DataItem,"ItemUrl")%>" border="0" />
< /ItemTemplate>
< /asp:DataList>
< /ItemTemplate>
< /asp:DataList>

图2
经过排查发现,因为界面结构的关系,需要把 <# DataBinder.Eval(Container.DataItem,"CatalogName")%> 这些数据写在数据遍历的DataList(ID为itemList)中,而这时候,在运行的时候,程序是去数据表的Collection中取相应的属性(CatalogSign及CatalogName),而在数据表中是没有这两个属性存在的,怎么办,就要想办法来读取栏目表(ID为catalogList) 的数据,尝试了无数种方法之后,在即将决定放弃这种方案的时候,同事告诉我不用修改程序就可以调用的方法,就是获取父对象,然后再显示。
但是怎么获了父对象?遍历的时候不是已经把原有的对象销毁了么?事实上,这个对象还存在,只是调用方法比较麻烦罢了。
将<%# DataBinder.Eval(Container.DataItem,......%>这种调用方法改成:<%# DataBinder.Eval(((DataListItem)Container.Parent.Parent).DataItem,.....%>之后就可以调用了,最后的结果就如图1所示,完全正常了。
以下是正常的部分代码:
客户端:
< asp:DataList id="catalogList" runat="server" DataKeyField="classID">
< ItemTemplate>
< asp: DataList id="itemList" runat="server" RepeatColumns="5">
< HeaderTemplate>
< %# DataBinder.Eval(((DataListItem)Container.Parent.Parent).DataItem,"CatalogName")%>
< /HeaderTemplate>
< ItemTemplate>
< img alt="" src="<%# DataBinder.Eval(Container.DataItem,"ItemUrl")%>" border="0" />
< /ItemTemplate>
< asp:DataList>
< /ItemTemplate>
< /asp:DataList>
后置代码
using System;
......//略去不写了
protect System.Web.UI.WebControls.DataList catalogList, itemList;
private void Page_Load(object sender, ....){
mySpace.BLL.ShowItemWithCatalog sc = new mySpace.BLL.ShowItemWithCatalog();
catalogList.DataSource = sc.AllCatalog();
catalogList.DataBinder();
}
private void itemList_ItemBound(.....){
mySpace.BLL.ShowItemWithCatalog sc = new mySpace.BLL.ShowItemWithCatalog();
itemList.DataSource = sc.ShowItemWithCatalog(DataBinder.Eval(Container.DataItem,"classID").ToString());
itemList.DataBinder();
}
private void initialize....//略去不写了
在这里要感谢我的同事给我这种调用思路,要不然我可能不仅仅用后置代码拋出表格,甚至还需要修改数据读取的方法,那事情就多了。。。
写到这里,你可能会问:为什么不用后置代码直接拋出表格的代码?不是不能使用,只是使用之后,页面修改的时候牵扯的问题太多,最起码,程序部分修改需要重新编译才能显示正确的内容,若只为了修改一个样式而去编译整站,明显不是最好的方案。
心情:
Tags:
日志引用地址[]:
相关日志
2条评论
在遍历二级的时候只要对ItemBound进行相应的操作就可以了,只要能取到各个父对象的标识符,再遍历第二层是可以实现的,就如我上面的itemlist_itemBound的方法。
我想请教个问题我想用datatlist 显示二级目录
为什么内层数据绑定总是出错