解决.net中DataList嵌套数据读取的问题

天气:sunny 心情:心情指数:3

由于项目的需要,需要使用.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....//略去不写了

在这里要感谢我的同事给我这种调用思路,要不然我可能不仅仅用后置代码拋出表格,甚至还需要修改数据读取的方法,那事情就多了。。。

写到这里,你可能会问:为什么不用后置代码直接拋出表格的代码?
不是不能使用,只是使用之后,页面修改的时候牵扯的问题太多,最起码,程序部分修改需要重新编译才能显示正确的内容,若只为了修改一个样式而去编译整站,明显不是最好的方案。
日志引用地址[]: http://www.ubbcn.com/flog/track.asp?postID=12

2条评论

帅青蛙
2007-6-12 13:16:23
内层数据绑定出错是什么?
在遍历二级的时候只要对ItemBound进行相应的操作就可以了,只要能取到各个父对象的标识符,再遍历第二层是可以实现的,就如我上面的itemlist_itemBound的方法。
unregister
erdbo
2007-6-12 13:02:50
恩,不错 太厉害了
我想请教个问题我想用datatlist 显示二级目录
为什么内层数据绑定总是出错
该日志已锁定
Copyright © 2004-2007 uBBcn.Com 版权所有 Powered by 帅青蛙
感谢huangna提供空间 感谢Mojojo的设计
 闽ICP备05000605号