none
Utilizando UpdatePanel + Exportar DataGrid para Excel usando Response.Write RRS feed

  • 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>&nbsp;<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>&nbsp;</div>
                      </ContentTemplate>
                      <Triggers>
                        <asp:AsyncPostBackTrigger ControlID="ddlRegional" EventName="SelectedIndexChanged" />
                        <asp:AsyncPostBackTrigger ControlID="ddlFilial" EventName="SelectedIndexChanged" />
                        <asp:PostBackTrigger ControlID="btnConfirmar" />
                      </Triggers>
                    </asp:UpdatePanel>


    sábado, 28 de abril de 2012 15:28

Todas as Respostas

  • Ninguém?

    Abraços.

    segunda-feira, 30 de abril de 2012 12:25
  • 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.

    segunda-feira, 7 de maio de 2012 17:50
  • Também daria certo se vc tivesse registrado um postback no seu updatePanel

    Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC

    terça-feira, 8 de maio de 2012 12:14
    Moderador