今天下午一直纳闷儿,因火这个DataList嵌套问题。
有两个表,ALBUM和PHOTO
ALBUM(AlbumID,AlbumName,UserName,....,UpdateTime) AlbumID是标识列,也是主键
PHOTO(PhotoID,PhotoName,AlbumName,...,PhotoFileUrl) PhotoID是标识列,也是主键现在我想
        从ALBUM表中取出AlbumName,UserName,UpdateTime
        从PHOTO表中取出PhotoName,PhotoFileUrl
用两个DataList嵌套一些相关代码:    <asp:DataList ID="DataListOut" runat="server" DataKeyField="AlbumName" OnItemDataBound="DataListOut_ItemDataBound">
      <ItemTemplate>
        <table>
          <tr>
            <td><%# Eval("AlbumName") %></td>
            <td><%# Eval("UserName") %></td>
            <td><%# Eval("UpdateDate") %></td>
          </tr>
        </table>
        <asp:DataList ID="DataLiatIn" runat="server">
          <ItemTemplate>
            <table>
              <tr>
               <td><img src='<%#Eval("PhotoFileUrl") %>' alt='<%# Eval("PhotoName") %>' /></td>
               <td><%#Eval("PhotoName") %></td>
              </tr>
            </table>
          </ItemTemplate>
        </asp:DataList>
      </ItemTemplate>
      <HeaderTemplate>
        <table>
          <td>相册名</td>
          <td>所属会员</td>
          <td>更新日期</td>
        </table>
      </HeaderTemplate>
    </asp:DataList>    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //外层绑定
              DataListOut.DataSource = CataAccess.GetAlbumName();
            DataListOut.DataBind();
        }
    }
    protected void DataListOut_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        //内层绑定
        string albumname = DataListOut.DataKeys[e.Item.ItemIndex].ToString().Trim();        DataList dl = (DataList)e.Item.FindControl("DataListIn");
        dl.DataSource = CataAccess.GetSomeAlbums(albumname);
        dl.DataBind();
    }
运行时,出现这个问题:index超出索引范围,必需为非负值并且小于集合大小断点调式:发现e.Item.ItemIndex 的值为0有朋友能帮我解决么,我弄了老半天呢?我的QQ181732481 不胜感激

解决方案 »

  1.   

    <asp:DataList ID="DataListOut" runat="server" DataKeyField="AlbumName"> 
          <ItemTemplate> 
            <table> 
              <tr> 
                <td> <%# Eval("AlbumName") %> </td> 
                <td> <%# Eval("UserName") %> </td> 
                <td> <%# Eval("UpdateDate") %> </td> 
              </tr> 
            </table> 
    <asp:Lable id="lable1" runat="server" text='<%#Eval("AlbumName")%>'>
            <asp:DataList ID="DataLiatIn" runat="server"> 
              <ItemTemplate> 
                <table> 
                  <tr> 
                  <td> <img src=' <%#Eval("PhotoFileUrl") %>' alt=' <%# Eval("PhotoName") %>' /> </td> 
                  <td> <%#Eval("PhotoName") %> </td> 
                  </tr> 
                </table> 
              </ItemTemplate> 
            </asp:DataList> 
          </ItemTemplate> 
          <HeaderTemplate> 
            <table> 
              <td>相册名 </td> 
              <td>所属会员 </td> 
              <td>更新日期 </td> 
            </table> 
          </HeaderTemplate> 
        </asp:DataList> 然后在绑定外层完成后,调用BindIn();
    private void BindIn()
    {
     foreach (DataListItem item in this.DataListOut.Items)
            {
                try
                {
                    //内层绑定 
                    Label lb = (Label)item.FindControl("lable1");
                    String id = lb.Text.Trim();                DataList dl = (DataList)item.FindControl("DataListIn");
                    dl.DataSource = CataAccess.GetSomeAlbums(id);
                    dl.DataBind();
                    lb.Visible=false;
                }
                catch (Exception e)
                {            }
            }
    }
      

  2.   


     protected void DataListOut_ItemDataBound(object sender, DataListItemEventArgs e) 
        { 
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    {
            //内层绑定 
            string albumname = DataListOut.DataKeys[e.Item.ItemIndex].ToString().Trim();         DataList dl = (DataList)e.Item.FindControl("DataListIn"); 
            dl.DataSource = CataAccess.GetSomeAlbums(albumname); 
            dl.DataBind(); 
        } 
    }
      

  3.   

    问题已经解决,自己粗心,将DataList写为DataLast,改正确后还是同样的错误提示。
    此时用3楼的方法就可以解决问题了。
    3楼的朋友,能解释一下吗?谢谢
      

  4.   

       if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
                {
     string albumname = DataListOut.DataKeys[e.Item.ItemIndex].ToString().Trim();//通过主键绑定
                   DataList   dl = null;
                  dl = (DataList)e.Item.FindControl("DataListIn")
                  dl.DataSource =  CataAccess.GetSomeAlbums(albumname); 
                   dl.DataBind();
                  }
            }
    参考
    http://www.cnblogs.com/liqiang665/archive/2007/06/06/773605.html
    http://www.cnblogs.com/ensure125/articles/382812.html