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
; }
}