Inquiridor
Utilizando UpdatePanel + Exportar DataGrid para Excel usando Response.Write

Pergunta
-
Olá Guerreiros .NET.
Estou com um pequeno problema e acredito que alguem já tenha passado por isso.
Tenho uma página com um update e um botão, nesse botão ele chama um metodo que efetua a busca no banco de dados e alimenta o DataTable, consequentimente esse DataTable serve como fonte para um DataGrid que tem o código abaixo para exportar para o excel:
/// <summary> /// OBJETIVO: Exportar um Datatable para Excel /// </summary> /// <param name="DataTable">DataTable a ser Exportado</param> /// <param name="nomeExcel">Nome do arquivo do excel gerado</param> /// <param name="responseAtual">Response vindo da Página que está efetuando a chamada</param> /// <param name="responseAtual">Form da página que está efetuando a chamada</param> public void ExportarGridView2Excel(DataTable dataTable, string nomeExcel, HttpResponse responseAtual, HtmlForm formAtual) { responseAtual.AddHeader("content-disposition", "attachment; filename=" + nomeExcel + ".xls"); responseAtual.Charset = ""; responseAtual.ContentType = "application/vnd.xls"; StringWriter stringWrite = new StringWriter(); HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); DataGrid dgTable = new DataGrid(); formAtual.Controls.Add(dgTable); dgTable.DataSource = dataTable; dgTable.DataBind(); dgTable.RenderControl(htmlWrite); responseAtual.Write(stringWrite.ToString()); responseAtual.End(); }
Só que esse meu botão tem um attribute para mostra um aguarde código abaixo:
function aguarde() { document.getElementById('divFundoAguarde').style.visibility='visible'; document.getElementById('divFundoAguarde').style.height = document.getElementById('geral').offsetHeight; document.getElementById('divAguarde').style.visibility='visible'; } function aguardeHide() { document.getElementById('divFundoAguarde').style.visibility='hidden'; document.getElementById('divAguarde').style.visibility='hidden'; }
Esse botão quando faço a chamada no click ele levanta a tela do aguarde e fica esperando o retorno da chamada.
Porém quando eu exporto meus dados para a tela efetuar o download o aguarde ainda continua ativo.
Acredito que esse problema seja relacionado ao meu response.write que efetou após a geração do excel.
Alguem poderia me informar como faço para que depois do response.write e após o cliente efetuar o download do arquivo faço para a página efetuar um postback ou algo do tipo?
Forte abraço a todos.
Adicionando atributo no onload:
btnConfirmar.Attributes.Add("onclick", "javascript:aguarde();");
No evento do botão no code behind:
if (dtRetorno.Rows.Count > 0) { ScriptManager.RegisterStartupScript(Page, GetType(), Guid.NewGuid().ToString(), " aguardeHide();", true); objRelatorios.ExportarGridView2Excel(dtRetorno, ddlTipoRelatorio.SelectedItem.Value, HttpContext.Current.Response, form1); }
Código do UpdatePanel:
<asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <h4 class="tituloForm"> Relátorios</h4> <hr class="linhaTracejada" /> <div class="box"> <div class="boxTop"> <span class="boxspanTop"></span> </div> <div class="boxConteudo"> <fieldset> <label id="Label18" class="labelForm" for="ddlRegional"> Regional</label> <asp:DropDownList ID="ddlRegional" runat="server" AutoPostBack="True" CssClass="inputEdit4" OnSelectedIndexChanged="ddlRegional_SelectedIndexChanged"> </asp:DropDownList> <br /> <label id="Label20" class="labelForm" for="ddlFilial"> Filial</label> <asp:ListBox ID="ddlFilial" runat="server" CssClass="inputEdit5" AutoPostBack="True" OnSelectedIndexChanged="ddlFilial_SelectedIndexChanged" SelectionMode="Multiple"> </asp:ListBox><br /> <label id="Label21" class="labelForm" for="ddlTipoRelatorio"> Tipo de Relatório</label> <asp:DropDownList ID="ddlTipoRelatorio" runat="server" CssClass="inputEdit5" AutoPostBack="true"> </asp:DropDownList><br /> <label id="lblData" class="labelForm" for="txtData" runat="server"> Data</label> <asp:TextBox ID="txtDataInicio" runat="server" CssClass="inputEdit2" MaxLength="10" onkeypress="formataData(this, event);"></asp:TextBox> <label style="margin-top: -20px; height: 15px;"> a</label> <asp:TextBox ID="txtDataFim" runat="server" CssClass="inputEdit2" MaxLength="10" onkeypress="formataData(this, event);"></asp:TextBox> <br /> </fieldset> </div> <div class="boxBottom"> <span class="boxspanBottom"></span> </div> </div> <div class="boxBotoesForm"> <asp:LinkButton ID="btnConfirmar" ToolTip="Confirmar" runat="server" CssClass="botaoConfirmar" OnClick="btnConfirmar_Click" PostBackUrl="~/wfMain.aspx"> <span>Confirmar</span> </asp:LinkButton> </div> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="ddlRegional" EventName="SelectedIndexChanged" /> <asp:AsyncPostBackTrigger ControlID="ddlFilial" EventName="SelectedIndexChanged" /> <asp:PostBackTrigger ControlID="btnConfirmar" /> </Triggers> </asp:UpdatePanel>
- Editado moreirawebmaster sábado, 28 de abril de 2012 15:34 Atualização
Todas as Respostas
-
-
Nossa ninguem com mais experiência que eu conseguiu resolver esse problema? Pois bem eu conseguir.
Para efetuar esse processo crei um metodo para ser chamado e criar o excel em outra página, ficou dessa forma:
static public void AjaxRedirect(string url, System.Web.UI.Page Page) { System.Text.StringBuilder builder = new System.Text.StringBuilder(); builder.Append("document.location.href='"); builder.Append(url); builder.Append("';"); ScriptManager.RegisterStartupScript(Page, Page.GetType(), "", builder.ToString(), true); }
Após verificar as regras na página, faço uma chamada no banco alimento um datatable, coloco em uma session e envio alguns parametro para a página seguinte que faz a chamada para exportar o excel que contem o response.end.
Funcionou perfeitamente e agora após o click do botão que aparecer a mensagem de aguarde some normalmente sem nenhuma intervenção após o terminar da primeira chamada.
Abraços.
-