Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

André Mailho

[Resolvido] Ajax: ButtonField do grid não é ativado pelo UpdatePa

Recommended Posts

Ola pessoal, estou com um problema ao tentar utilizar o componente UpdatePanel do ajax na minha pagina.

Pretendo atualizar meu gridview asincronicamente(?).

 

Ao clicar em um botao com o nome do diretorio, meu grid percorre este caminho e lista os itens da pasta(DataTable) no Grid. Até ai beleza, ele atualiza rapidamento por causa do UpdatePanel! O problema, é que cada liha do meu grid possui um botao Download (asp:ButtonField); e eu nao consigo declara-lo na tag Triggers do updatePanel porque este componente nao possui ID.

 

Ja tentei retirar a tag Triggers e usar as propriedades: ChildrenAsTriggers="true" UpdateMode="Conditional" no UpdatePanel!

Mas continua a mesma coisa. Ele funciona com os botoes, mas nao com o buttonField.

 

Segue como esta o codigo:

 

<asp:ScriptManager ID="ScriptManager1" runat="server" />
       <asp:UpdatePanel ID="UpdatePanel1" runat="server"  ChildrenAsTriggers="true" UpdateMode="Conditional">
           <Triggers>
               <asp:AsyncPostBackTrigger ControlID="btnPre" EventName="Click" />
               <asp:AsyncPostBackTrigger ControlID="btnPos" EventName="Click" />
           </Triggers>           <ContentTemplate>
               <fieldset style="border: none;">

<%-- Restante da pagina --%>

 <asp:Button ID="btnPre" CssClass="btnDiretorioDisab" Enabled="false" runat="server"
                                       Text="Formalização PF" OnClick="btnPre_Click" /></p>

 <asp:Button ID="btnPre" CssClass="btnDiretorioDisab" Enabled="false" runat="server"
                                       Text="Formalização PF" OnClick="btnPre_Click" /></p>

<%-- Restante da pagina --%>


<asp:Panel ID="pnlGrid" runat="server" Visible="false">
        <asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None">
-//- 
          <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="center" />
                    <Columns>
                     <asp:ButtonField ButtonType="Button" CommandName="download" Text="Download" ControlStyle-CssClass="button" />
                     </Columns>                  <RowStyle BackColor="#EFF3FB" HorizontalAlign="center" Height="50" />
                 <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
                 </asp:GridView>
               </asp:Panel>

<%-- Restante da pagina --%>

       </fieldset>
           </ContentTemplate>
       </asp:UpdatePanel>

 

Alguem saberia me dizer como fazer o updatePanel reconhecer o evento Click do ButtonField? Ou uma solução alternativa?

 

Agradeço novamente a ajuda de todos.

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então quintelab, eu declaro o ID para o buttonfield no evento GridView1_RowDataBound:

 

if (e.Row.RowType == DataControlRowType.DataRow)
{
    foreach (GridViewRow gvRow in GridView1.Rows)
    {
        Button dow = new Button();
        dow.ID = "btnDownload";
    }
}

 

Mas ele não reconhece! Tentei adicinar o fno evento Page_load mas tambem não funcionou.

Se o problema fosse, ele apagar o valor da variavel ao recarregar a pagina, o Page_load deveria contornar isso!? Não?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como eu poderia fazer isso? tentei declarar assim:

 

 if (e.Row.RowType == DataControlRowType.DataRow)
 {
   foreach (GridViewRow gvRow in GridView1.Rows)
    {
       AsyncPostBackTrigger trigger = new AsyncPostBackTrigger();

       e.Row.Cells[0].ID = "btnDownload";
       trigger.ControlID = e.Row.Cells[0].ID;
       trigger.EventName = "Click";

       this.UpdatePanel1.Triggers.Add(trigger);
    }
 }

 

Mas ele continua dizendo que o ID nao existe:

A control with ID 'btnDownload' could not be found for the trigger in UpdatePanel 'UpdatePanel1'.

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza quintelab, eu consegui fazer o update panel reconhecer o botao do Grid:

 

Button btnDownload = new Button();
btnDownload = (Button)gvRow.Cells[0].Controls[0];

 

Usando ChildrenAsTriggers="true" UpdateMode="Conditional na tag do UpdatePanel, e não declarando a tag Triggers ele reconhece o botão.

 

Mas agora quando eu clico ele me mostra um erro de javascript! Aquele erro genérico que não da pra debugar: parse error exception: the message cannot e parse.

 

Para baixar o arquivo, estou usando:

 

Response.WriteFile(fullPath); 

 

Dentro de um bloco try/catch.

Com finally:

 

HttpContext.Current.ApplicationInstance.CompleteRequest();

 

Pesquisando vi que algumas pessoas usaram

 

Response.redirect(fullPath, false);

 

O false é para que o metodo não termine a chamada internamente! E sim com o httpcontext. Mas entao, o javascript começou a mostrar o erro Acess is denied.

 

Encontrei uma possivel solução aqui:

 

http://stackoverflow.com/questions/3470859/why-is-ie7-and-ie8-giving-me-access-denied-when-calling-jquery

 

Mas não consegui entender muito bem! Sera que é isso mesmo?

 

Alguém?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, como não tive mais respostas, de tanto mexer consegui resolver de outra forma! Fica a minha resolução caso alguém precise:

 

Parei de usar o ButtonField, e mudei para asp:ImageButton dentro do TemplateField da grid. Passo os parametros por Eval, dentro da propriedade AlternateText. E recebo o valor na propriedade onClick como um botão normal:

 

Meu updatePanel:

 

<asp:UpdatePanel ID="UpdatePanel1" runat="server" >

 

Meu botão dentro do GridView:

 

<Columns>            
<asp:TemplateField>
 <ItemTemplate>
  <asp:ImageButton AlternateText='<%# Eval("Filial") + ";" + Eval("Contrato")  + ";" + Eval("CPF/CNPJ") %>' runat="server" ID="btnDetalhes" ToolTip="Detalhes" CssClass="btnSelecionar" ImageUrl="~/img/notepad.png" OnClick="btnDetalhes_Click" />
  </ItemTemplate>
</asp:TemplateField>
</Columns>

 

E meu evento do botão, aonde recebo e trato os argumentos:

 

ImageButton btnDetalhes = sender as ImageButton;

string[] args = new string[3];
args = btnDetalhes.AlternateText.ToString().Split(';');
txtFilial.Text = args[0].ToString();
txtContrato.Text = args[1].ToString();
txtCPF.Text = args[2].ToString();

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.