none
Button no asp.net não reconhece evento click em determinados momentos RRS feed

  • Pergunta

  • Estou utilizando um UserControl dentro de um modal,  que recebe um conteúdo dinâmico, para uma busca, dentro de um PlaceHolder. A pesquisa é renderiza perfeitamente e ainda consigo realizar a busca normalmente. Fechando o modal e reabrindo a pesquisa, digito as informações e tento buscar, neste momento os campos são limpos (é como se o componente atualizasse), e o evento click não chega ser executado. Porém após este processo preenchendo o formulário e buscando, funciona perfeitamente.

    Alguma sugestão?

    terça-feira, 16 de maio de 2017 20:03

Respostas

  • Consegui resolver o problema!

    Toda vez que o controle era adicionado, automaticamente era definido um ID para o controle. Com isso o ascx não reconhecia o controle no primeiro click, só a partir do segundo.

    Para resolver criei uma variável do tipo Control e atribui um Id fixo antes de adicioná-lo.

    protected void Page_Load(object sender, EventArgs e){
            if (!string.IsNullOrEmpty(ControleNome)){
                 phConteudo.Controls.Clear();
                 Control child = this.LoadControl(ControleNome);
                 child.ID = "ascx_modal"             
                 phConteudo.Controls.Add(this.LoadControl(child));
                 upForm.Update();
            }
    }
    private void CarregarModal(TipoModal tipoModal){
                
              ControleNome = GetNomePagina((TipoModal)tipoModal);
              phConteudo.Controls.Clear();
    	  Control child = this.LoadControl(ControleNome);
              child.ID = "ascx_modal"
              phConteudo.Controls.Add(child);
              upForm.Update();
    }


    quinta-feira, 18 de maio de 2017 19:06

Todas as Respostas

  • Poste o código para termos para melhorar a resolução do problema.
    terça-feira, 16 de maio de 2017 23:44
  • Modal.ascx

    <asp:Panel runat="server" class="modal fade bs-example-modal-lg" ID="CTGISModal" role="dialog" aria-labelledby="myLargeModalLabel">
        <div class="modal-dialog modal-lg" role="document">
            <asp:UpdatePanel ID="upForm" UpdateMode="Conditional" runat="server" class="modal-content">
                <ContentTemplate>
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                        <h4 class="modal-title">
                            <asp:Label ID="lblTitulo" Text="Titulo" runat="server" />
                        </h4>
                    </div>
                    <div class="modal-body">
                        <div class="row">
                            <div class="col-lg-12">
                                <asp:PlaceHolder ID="phConteudo" runat="server" />
                            </div>
                        </div>
                    </div>
                </ContentTemplate>
            </asp:UpdatePanel>        
        </div>
    </asp:Panel>

    Pesquisa.ascx

    <ajaxToolkit:TabContainer ID="TabContainer1" runat="server" ActiveTabIndex="0">
        <ajaxToolkit:TabPanel ID="atkPesquisa" HeaderText="Pesquisa" runat="server">
            <ContentTemplate>
                <asp:UpdatePanel runat="server" ID="upPesquisa" UpdateMode="Conditional">
                    <ContentTemplate>
    			Formulário
                    </ContentTemplate>
                </asp:UpdatePanel>
            </ContentTemplate>
        </ajaxToolkit:TabPanel>
    </ajaxToolkit:TabContainer>

    No Componente principal que é o modal, atribuo o controle em dois métodos

    O primeiro é no Page_Load, porem só é executado quando ocorre alguma alteração no UserControl e a pagina necessita receber o controle que já está atribuído.

    Modal.ascx.cs

    protected void Page_Load(object sender, EventArgs e){
            if (!string.IsNullOrEmpty(ControleNome)){
                 phConteudo.Controls.Clear();
                 phConteudo.Controls.Add(this.LoadControl(path));
                 upForm.Update();
            }
    }

    E o outro evento é o CarregarModal que é usado a primeira vez que o componente é usado.

    Modal.ascx.cs

    private void CarregarModal(TipoModal tipoModal){
                
              ControleNome = GetNomePagina((TipoModal)tipoModal);
              phConteudo.Controls.Clear();
              phConteudo.Controls.Add(ControleNome);
              upForm.Update();
    }

    Controle adicionado no modal

    Neste UserControl criei o método click e atribui no Page_Load tentando solucionar o problema, mas deste jeito ou atribuído diretamente na tag <asp:Button> o resultado é o mesmo.

    Pesquisa.ascx.cs

    protected void Page_Init(Object senser, EventArgs e)
    {
       upPesquisa.Update();
    }
    
    protected void Page_Load(object sender, EventArgs e)
    {
       btnBuscar.Click += click;            
    }
    
    void click(object sender, EventArgs e)
    {
       metodoBuscar()
    }

    Ao abrir o modal, digitar as informações e buscar, o evento click é acessado, o problema acontece se fecho este modal, abro novamente e tento buscar, a primeira vez que clico no botão ele limpa o formulário e não acessa o método click, em seguida se clico no botão mesmo sem fechar o modal o evento é acessado.

    Alguém pode me ajudar?



    quinta-feira, 18 de maio de 2017 11:36
  • Consegui resolver o problema!

    Toda vez que o controle era adicionado, automaticamente era definido um ID para o controle. Com isso o ascx não reconhecia o controle no primeiro click, só a partir do segundo.

    Para resolver criei uma variável do tipo Control e atribui um Id fixo antes de adicioná-lo.

    protected void Page_Load(object sender, EventArgs e){
            if (!string.IsNullOrEmpty(ControleNome)){
                 phConteudo.Controls.Clear();
                 Control child = this.LoadControl(ControleNome);
                 child.ID = "ascx_modal"             
                 phConteudo.Controls.Add(this.LoadControl(child));
                 upForm.Update();
            }
    }
    private void CarregarModal(TipoModal tipoModal){
                
              ControleNome = GetNomePagina((TipoModal)tipoModal);
              phConteudo.Controls.Clear();
    	  Control child = this.LoadControl(ControleNome);
              child.ID = "ascx_modal"
              phConteudo.Controls.Add(child);
              upForm.Update();
    }


    quinta-feira, 18 de maio de 2017 19:06