I want to be able to Export to Excel from a RadGrid. The RadGrids on various pages could have 1 detail table or multiple nested detail tables (detail tables inside detail tables.)
I want the user to be able to expand one or more records to view the detail tables and if they export to excel, export it exactly as they see it with paging ignored. There may be multiple expanded detail tables on the same level, or nested tables may be expanded.
Here's the HTML and VB.NET code behind of a fully independent sample page of how our grids are implemented. This has a fake datasource hard coded, we're using LINQ queries to a SQL database in the real website.
This was made in Visual Studio 2012.
Thanks for any help you can offer. We haven't found any help online that has worked.
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm1.aspx.vb" Inherits="DetailTableExportSample.WebForm1" %>
<%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %>
<!DOCTYPE html>
<
html
xmlns
=
"http://www.w3.org/1999/xhtml"
>
<
head
runat
=
"server"
>
<
title
></
title
>
</
head
>
<
body
>
<
form
id
=
"form1"
runat
=
"server"
>
<
div
>
<
b
>Thanks for helping!</
b
><
br
/>
What we want is for one or more of the records in the master (top level) RadGrid to be expanded to display the detail table and then that view, exactly as you see it, to be exportable to Excel.
<
br
/><
br
/>
Below is a simplified example to illustrate our setup. The solution will also need to work if there are multiple detail tables nested (meaning the detail table has it's own detail table).
<
br
/><
br
/>
Please post a response in the forum thread.
</
div
>
<
br
/><
br
/>
<
telerik:RadScriptManager
runat
=
"server"
ID
=
"RadScriptManager1"
/>
<
telerik:RadGrid
AllowSorting
=
"true"
ID
=
"rgPeople"
runat
=
"server"
AutoGenerateColumns
=
"False"
Width
=
"500px"
CellSpacing
=
"0"
GridLines
=
"None"
>
<
GroupingSettings
CaseSensitive
=
"false"
/>
<
ExportSettings
FileName
=
"PM Export"
IgnorePaging
=
"true"
HideStructureColumns
=
"true"
OpenInNewWindow
=
"true"
Excel-Format
=
"Html"
ExportOnlyData
=
"true"
/>
<
MasterTableView
PageSize
=
"25"
DataKeyNames
=
"LName"
CommandItemDisplay
=
"Top"
AllowPaging
=
"true"
AllowSorting
=
"true"
>
<
DetailTables
>
<
telerik:GridTableView
DataKeyNames
=
"courseID"
Name
=
"rgDetail"
Width
=
"100%"
AllowFilteringByColumn
=
"false"
>
<
Columns
>
<
telerik:GridBoundColumn
DataField
=
"courseID"
HeaderText
=
"Course ID"
/>
<
telerik:GridBoundColumn
DataField
=
"name"
HeaderText
=
"Course"
/>
<
telerik:GridBoundColumn
DataField
=
"classroom"
HeaderText
=
"Room"
/>
</
Columns
>
</
telerik:GridTableView
>
</
DetailTables
>
<
EditFormSettings
EditColumn-InsertText
=
"Add"
EditColumn-ButtonType
=
"ImageButton"
/>
<
CommandItemSettings
ShowAddNewRecordButton
=
"false"
ShowExportToExcelButton
=
"true"
/>
<
Columns
>
<
telerik:GridBoundColumn
DataField
=
"FName"
HeaderText
=
"First"
/>
<
telerik:GridBoundColumn
DataField
=
"LName"
HeaderText
=
"Last"
/>
<
telerik:GridBoundColumn
DataField
=
"Gender"
HeaderText
=
"Gender"
/>
</
Columns
>
<
PagerStyle
AlwaysVisible
=
"true"
PageSizeControlType
=
"RadComboBox"
PageSizes
=
"25,50,100,200,500"
/>
</
MasterTableView
>
</
telerik:RadGrid
>
</
form
>
</
body
>
</
html
>
Imports
Telerik.Web.UI
Public
Class
WebForm1
Inherits
System.Web.UI.Page
Property
people
As
List(Of person)
Get
Return
ViewState(
"_people"
)
End
Get
Set
(value
As
List(Of person))
ViewState(
"_people"
) = value
End
Set
End
Property
Property
classes
As
List(Of course)
Get
Return
ViewState(
"_classes"
)
End
Get
Set
(value
As
List(Of course))
ViewState(
"_classes"
) = value
End
Set
End
Property
Property
attendees
As
List(Of enrollment)
Get
Return
ViewState(
"_attendees"
)
End
Get
Set
(value
As
List(Of enrollment))
ViewState(
"_attendees"
) = value
End
Set
End
Property
Protected
Sub
Page_Load(
ByVal
sender
As
Object
,
ByVal
e
As
System.EventArgs)
Handles
Me
.Load
If
Not
IsPostBack
Then
MakePeopleList()
MakeClassesList()
MakeAttendeesList()
rgPeople.Rebind()
End
If
End
Sub
Private
Sub
rgPeople_DetailTableDataBind(sender
As
Object
, e
As
Telerik.Web.UI.GridDetailTableDataBindEventArgs)
Handles
rgPeople.DetailTableDataBind
Dim
dataItem
As
GridDataItem =
CType
(e.DetailTableView.ParentItem, GridDataItem)
Select
Case
e.DetailTableView.Name
Case
"rgDetail"
Dim
student
As
String
= dataItem.GetDataKeyValue(
"LName"
).ToString
e.DetailTableView.DataSource = From a
In
attendees
Join c
In
classes
On
c.courseID Equals a.courseID
Where a.student_LName = student
Select
c
End
Select
End
Sub
Private
Sub
rgPeople_NeedDataSource(sender
As
Object
, e
As
Telerik.Web.UI.GridNeedDataSourceEventArgs)
Handles
rgPeople.NeedDataSource
'our actual datasource is a LINQ-SQL query
If
people.Count = 0
Then
rgPeople.DataSource =
Nothing
Else
rgPeople.DataSource = From p
In
people
End
If
End
Sub
#Region "Make_Fake_DataSources"
Sub
MakePeopleList()
Dim
p
As
New
List(Of person)
'people = New List(Of person)
p.Add(
New
person(
"Gary"
,
"Ritter"
,
"Male"
))
p.Add(
New
person(
"Bill"
,
"Becker"
,
"Male"
))
p.Add(
New
person(
"Michael"
,
"McClary"
,
"Male"
))
p.Add(
New
person(
"Angela"
,
"Paulone"
,
"Female"
))
p.Add(
New
person(
"Alison"
,
"Weichert"
,
"Female"
))
people = p
End
Sub
Sub
MakeClassesList()
Dim
c
As
New
List(Of course)
c.Add(
New
course(
"HIS101"
,
"American History"
,
"H13"
))
c.Add(
New
course(
"ENG101"
,
"English - Freshman"
,
"E10"
))
c.Add(
New
course(
"PHY101"
,
"Physical Education"
,
"GYM"
))
c.Add(
New
course(
"MTH201"
,
"Algebra 2"
,
"M04"
))
c.Add(
New
course(
"SCI106"
,
"Computer Basics"
,
"L03"
))
c.Add(
New
course(
"SCI110"
,
"AFJROTC"
,
"S10"
))
classes = c
End
Sub
Sub
MakeAttendeesList()
Dim
a
As
New
List(Of enrollment)
a.Add(
New
enrollment(
"Ritter"
,
"MTH201"
))
a.Add(
New
enrollment(
"Ritter"
,
"SCI110"
))
a.Add(
New
enrollment(
"Ritter"
,
"PHY101"
))
a.Add(
New
enrollment(
"Becker"
,
"SCI106"
))
a.Add(
New
enrollment(
"Becker"
,
"HIS101"
))
a.Add(
New
enrollment(
"McClary"
,
"HIS101"
))
a.Add(
New
enrollment(
"McClary"
,
"SCI106"
))
a.Add(
New
enrollment(
"McClary"
,
"ENG101"
))
a.Add(
New
enrollment(
"Paulone"
,
"HIS101"
))
a.Add(
New
enrollment(
"Paulone"
,
"PHY101"
))
a.Add(
New
enrollment(
"Paulone"
,
"SCI110"
))
a.Add(
New
enrollment(
"Weichert"
,
"PHY101"
))
a.Add(
New
enrollment(
"Weichert"
,
"ENG101"
))
a.Add(
New
enrollment(
"Weichert"
,
"MTH201"
))
attendees = a
End
Sub
#End Region
End
Class
#Region "Datasource_Classes"
<Serializable>
Public
Class
person
Public
Property
FName
As
String
Public
Property
LName
As
String
Public
Property
Gender
As
String
Public
Sub
New
(First_Name
As
String
, Last_Name
As
String
, my_Gender
As
String
)
Me
.FName = First_Name
Me
.LName = Last_Name
Me
.Gender = my_Gender
End
Sub
Public
Sub
New
()
End
Sub
End
Class
<Serializable>
Public
Class
course
Public
Property
courseID
As
String
Public
Property
name
As
String
Public
Property
classroom
As
String
Public
Sub
New
(id
As
String
, course_name
As
String
, classroom_number
As
String
)
Me
.courseID = id
Me
.name = course_name
Me
.classroom = classroom_number
End
Sub
Public
Sub
New
()
End
Sub
End
Class
<Serializable>
Public
Class
enrollment
Public
Property
student_LName
As
String
Public
Property
courseID
As
String
Public
Sub
New
(Last_Name
As
String
, id
As
String
)
Me
.student_LName = Last_Name
Me
.courseID = id
End
Sub
Public
Sub
New
()
End
Sub
End
Class
#End Region