I am exporting a GridView to Excel (code below) and it works fine except for that I am not able to export the current sorting on the GridView. It always takes the initial default used when I initially load the GridView.
In the "Excel_Button_Click" I use the saved "sortexpression" from the GridView1_Sorting event but I cannot get it to work.
Code: Export to Excel
Code:
Protected Sub Excel_Button_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Excel_Button.Click
Dim GridView2 As New GridView
GridView2 = GridView1
GridView2.AllowPaging = False
GridViewSortExpression = Session("SortExpression")
myAdsDataTable = Session("SalesTicketDataTable")
GridView2.DataSource = SortDataTable(myAdsDataTable, False)
GridView2.DataBind()
Export("SalesTicketExport.xls", GridView2)
End Sub
Public Shared Sub Export(ByVal fileName As String, ByVal gv As GridView)
HttpContext.Current.Response.Clear()
HttpContext.Current.Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", fileName))
HttpContext.Current.Response.ContentType = "application/ms-excel"
Dim sw As IO.StringWriter = New IO.StringWriter
Dim htw As HtmlTextWriter = New HtmlTextWriter(sw)
' Create a form to contain the grid
Dim table As Table = New Table
table.GridLines = gv.GridLines
' add the header row to the table
If (Not (gv.HeaderRow) Is Nothing) Then
PrepareControlForExport(gv.HeaderRow)
table.Rows.Add(gv.HeaderRow)
End If
' add each of the data rows to the table
For Each row As GridViewRow In gv.Rows
PrepareControlForExport(row)
table.Rows.Add(row)
Next
' add the footer row to the table
If (Not (gv.FooterRow) Is Nothing) Then
PrepareControlForExport(gv.FooterRow)
table.Rows.Add(gv.FooterRow)
End If
' render the table into the htmlwriter
table.RenderControl(htw)
' render the htmlwriter into the response
HttpContext.Current.Response.Write(sw.ToString)
HttpContext.Current.Response.End()
End Sub
' Replace any of the contained controls with literals
Private Shared Sub PrepareControlForExport(ByVal control As Control)
Dim i As Integer = 0
Do While (i < control.Controls.Count)
Dim current As Control = control.Controls(i)
If (TypeOf current Is LinkButton) Then
control.Controls.Remove(current)
control.Controls.AddAt(i, New LiteralControl(CType(current, LinkButton).Text))
ElseIf (TypeOf current Is ImageButton) Then
control.Controls.Remove(current)
control.Controls.AddAt(i, New LiteralControl(CType(current, ImageButton).AlternateText))
ElseIf (TypeOf current Is HyperLink) Then
control.Controls.Remove(current)
control.Controls.AddAt(i, New LiteralControl(CType(current, HyperLink).Text))
ElseIf (TypeOf current Is DropDownList) Then
control.Controls.Remove(current)
control.Controls.AddAt(i, New LiteralControl(CType(current, DropDownList).SelectedItem.Text))
ElseIf (TypeOf current Is CheckBox) Then
control.Controls.Remove(current)
control.Controls.AddAt(i, New LiteralControl(CType(current, CheckBox).Checked))
ElseIf (TypeOf current Is Image) Then
control.Controls.Remove(current)
End If
If current.HasControls Then
PrepareControlForExport(current)
End If
i = (i + 1)
Loop
End Sub
Code :GridView Sort event
Code:
Protected Sub GridView1_Sorting1(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles GridView1.Sorting
GridViewSortExpression = e.SortExpression
Session("SortExpression") = e.SortExpression
myAdsDataTable = Session("SalesTicketDataTable")
Dim pageIndex As Integer = GridView1.PageIndex
GridView1.DataSource = SortDataTable(myAdsDataTable, False)
GridView1.DataBind()
GridView1.PageIndex = pageIndex
End Sub