Na parte anterior do artigo, criamos o método que fará a exportação do GridView, Poderíamos parar por ali mas existe a possibilidade de o GridView conter TemplateFields, contendo WebControls. Para essa situação, deveremos criar um método que substitui esses TemplateFields com WebControls por textos contidos nos próprios WebControls.
private static void PrepareGridViewForExport(Control gv)
{
LinkButton lb = new LinkButton();
Literal l = new Literal();
string name = String.Empty;
for (int i = 0; i < gv.Controls.Count; i++)
{
if (gv.Controls[i].GetType() == typeof(LinkButton))
{
l.Text = (gv.Controls[i] as LinkButton).Text;
gv.Controls.Remove(gv.Controls[i]);
gv.Controls.AddAt(i, l);
}
else if (gv.Controls[i].GetType() == typeof(DropDownList))
{
l.Text = (gv.Controls[i] as DropDownList).SelectedItem.Text;
gv.Controls.Remove(gv.Controls[i]);
gv.Controls.AddAt(i, l);
}
else if (gv.Controls[i].GetType() == typeof(ImageButton))
{
l.Text = (gv.Controls[i] as ImageButton).ToolTip;
gv.Controls.Remove(gv.Controls[i]);
gv.Controls.AddAt(i, l);
}
else if (gv.Controls[i].GetType() == typeof(Button) ||
gv.Controls[i].GetType() == typeof(HiddenField) ||
gv.Controls[i].GetType() == typeof(CheckBox))
{
gv.Controls.Remove(gv.Controls[i]);
}
if (gv.Controls[i].HasControls())
{
PrepareGridViewForExport(gv.Controls[i]);
}
}
}
Aqui criamos uma função recursiva que lê todos os controles de um GridView. Uma vez detectado um controle, é verificado seu tipo para poder ler seu conteúdo e jogar num controle Literal, que é colocado no logar do WebControl.
Pronto, com esse método, podemos criar um método público que fará a exportação do gridView:
public static void ExportGridView(FileType pType, string pFileName, GridView pGrid)
{
pGrid.AllowPaging = false;
pGrid.GridLines = GridLines.Both;
PrepareGridViewForExport(pGrid);
ExportGrid(pGrid, pType, pFileName);
}
A única observação a ser feita em relação a esse método é que ele retira a paginação do GridView, pois precisamos exportar todo o conteúdo do Grid.
Com nossa classe pronta, podemos codificar o evento do botão contido na página Default.aspx:
protected void btnExport_Click(object sender, EventArgs e)
{
Exporter.ExportGridView(Exporter.FileType.Excel, "teste", this.GridView1);
}
O leitor poderá testar a aplicação exportando para Word e Excel. Vale ressaltar que é mantida a formatação do Grid:
Com o resultado da exportação, terminamos nosso artigo.
Espero que seja útil.
Um grande abraço a todos!