I'm trying to do Hierarchical Grid using two inner detail table, and the second table has also hierarchy.For the first hierarchy it works fine but while I'm trying to expand the second inner table it raise Index was out of range. Must be non-negative and less than the size of the
collection.Parameter name: index ,
I have put my code sample here
Thanks,
I have put my code sample here
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title></title> <telerik:RadStyleSheetManager id="RadStyleSheetManager1" runat="server" /></head><body> <form id="form1" runat="server"> <telerik:RadScriptManager ID="RadScriptManager1" runat="server"> <Scripts> <%--Needed for JavaScript IntelliSense in VS2010--%> <%--For VS2008 replace RadScriptManager with ScriptManager--%> <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.Core.js" /> <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.jQuery.js" /> <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.jQueryInclude.js" /> </Scripts> </telerik:RadScriptManager> <script type="text/javascript"> //Put your JavaScript code here. </script> <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server"> </telerik:RadAjaxManager> <div> <telerik:RadGrid ID="RadGrid1" runat="server" OnNeedDataSource="RadGrid1_NeedDataSource" OnDetailTableDataBind="RadGrid1_DetailTableDataBind"> <MasterTableView DataKeyNames="ID"> <DetailTables> <telerik:GridTableView AutoGenerateColumns="True" Caption="Items" AllowSorting="false" Width="100%" PageSize="7" DataMember="Items"> <ParentTableRelation> <telerik:GridRelationFields DetailKeyField="MasterItemID" MasterKeyField="ID" /> </ParentTableRelation> </telerik:GridTableView> <telerik:GridTableView AutoGenerateColumns="True" Caption="Sub Kit" AllowSorting="false" Width="100%" PageSize="7" DataMember="Details"> <ParentTableRelation> <telerik:GridRelationFields DetailKeyField="MasterID" MasterKeyField="ID" /> </ParentTableRelation> <DetailTables> <telerik:GridTableView AutoGenerateColumns="True" Caption="sub Items" AllowSorting="false" Width="100%" PageSize="7" DataMember="SubKitItems"> <ParentTableRelation> <telerik:GridRelationFields DetailKeyField="ParentID" MasterKeyField="ID" /> </ParentTableRelation> </telerik:GridTableView> <telerik:GridTableView AutoGenerateColumns="True" Caption="Sub Kit" AllowSorting="false" Width="100%" PageSize="7" DataMember="SubKitDetails"> <ParentTableRelation> <telerik:GridRelationFields DetailKeyField="ParentID" MasterKeyField="ID" /> </ParentTableRelation> </telerik:GridTableView> </DetailTables> </telerik:GridTableView> </DetailTables> </MasterTableView> </telerik:RadGrid> </div> </form></body></html>using System;using System.Collections.Generic;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Data;using System.Configuration;using System.Web.Security;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using Telerik.Web.UI;public partial class Default : System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) { } protected void RadGrid1_NeedDataSource(object source, GridNeedDataSourceEventArgs e) { if(e.IsFromDetailTable) return; RadGrid1.DataSource = MyList; } protected void RadGrid1_DetailTableDataBind(object source, GridDetailTableDataBindEventArgs e) { if (e.DetailTableView.DataMember == "Details") { e.DetailTableView.DataSource = MyList.Find( delegate(Master master) { return master.ID == Convert.ToInt32(e.DetailTableView.ParentItem.GetDataKeyValue("ID")); } ).Details; } if (e.DetailTableView.DataMember == "Items") { int parentId = Convert.ToInt32(e.DetailTableView.ParentItem.GetDataKeyValue("ID")); e.DetailTableView.DataSource = MyList.Find( delegate(Master master) { return master.ID == Convert.ToInt32(e.DetailTableView.ParentItem.GetDataKeyValue("ID")); } ).Items; } if (e.DetailTableView.DataMember == "SubKitDetails") { e.DetailTableView.DataSource = MyList.Find( delegate(Master master) { return master.ID == Convert.ToInt32(e.DetailTableView.ParentItem.GetDataKeyValue("ID")); } ).SubKitDetails; } if (e.DetailTableView.DataMember == "SubKitItems") { e.DetailTableView.DataSource = MyList.Find( delegate(Master master) { return master.ID == Convert.ToInt32(e.DetailTableView.ParentItem.GetDataKeyValue("ID")); } ).SubKitItems; } } public List<Master> MyList { get { List<Master> items = new List<Master>(); for (int i = 0; i < 5; i++) { Master item = new Master(); item.ID = i; item.Name = String.Format("Item{0}", i); List<Detail> detailList = new List<Detail>(); List<Items> itemlist = new List<Items>(); //sub items List<Detail> subKitDetails = new List<Detail>(); List<Items> subKitItems = new List<Items>(); for (int j = 0; j < 5; j++) { Detail detailItem = new Detail(); Items myItem = new Items(); detailItem.ID = j; detailItem.Name = String.Format("Item{0}", j); detailItem.MasterID = i; detailList.Add(detailItem); myItem.ID = j; myItem.Name = String.Format("Item{0},{1}", j, "Test Item"); myItem.MasterItemID = i; itemlist.Add(myItem); subKitDetails = GetSubKitDetails(i, j); subKitItems = GetSubItems(i, j); } item.Details = detailList; item.Items = itemlist; item.SubKitDetails = subKitDetails; item.SubKitItems = subKitItems; items.Add(item); } return items; } } private List<Items> GetSubItems(int i, int j) { List<Items> subKitItems = new List<Items>(); for (int k = 0; k < 5; k++) { Items myItem = new Items(); myItem.ID = k; myItem.MasterItemID=i; myItem.Name = String.Format("Item{0},{1}", k, "Test subItem"); myItem.ParentID = i; myItem.SubParentID = j; subKitItems.Add(myItem); } return subKitItems; } private List<Detail> GetSubKitDetails(int i, int j) { List<Detail> subKitDetails = new List<Detail>(); for (int k = 0; k < 5; k++) { Detail detailItem = new Detail(); detailItem.MasterID = i; detailItem.ID = k; detailItem.Name = String.Format("Item{0},{1}", k, "Test sub details"); detailItem.ParentID = i; detailItem.SubParentID = j; subKitDetails.Add(detailItem); } return subKitDetails; }} public class Master { public int ID { get; set; } public int ParentID { get; set; } public string Name { get; set; } public List<Detail> Details { get; set; } public List<Items> Items { get; set; } public List<Detail> SubKitDetails { get; set; } public List<Items> SubKitItems { get; set; } } public class Detail : Master { public int MasterID { get; set; } public int SubParentID { get; set; } } public class DetailSecond : Master { public int MasterDetailID { get; set; } public int ParentID { get; set; } } public class Items : Master { public int MasterItemID { get; set; } public int SubParentID { get; set; } }