none
TextChanged disparado sem motivo RRS feed

  • Pergunta

  • Sempre entendi que o AutoPostBack=true de um controle é responsável por realizar um Submit quando há uma alteração ou interação com o próprio controle. Tanto é que, por exemplo, se eu tiver um DropDownList com todos as regiões do país e quiser preencher uma lista com as unidades federativas que pertencem à região escolhida, preciso configurar o DropDownList para AutoPostBack=true e usar o método SelectedIndexChanged para chamar o método que vai fazer a pesquisa no banco de dados e carregar a lista. Outros controles dos formulário com AutoPostBack=true não são disparados.

    No entanto, criando um formulário para uma melhor experiência do usuário, a cada alteração de valores dos controles, chamo o método para atualizar o banco de dados. Isso dispensa o uso de um botão para "gravar". São vários controles com AutoPostBack=true mas apenas dois deles sempre são acionados quando clico em qualquer botão no formulário.

    <table>
            <tr>
                <td class="Caption">Ano vigente</td>
                <td><asp:TextBox runat="server" ID="txtAnoVigente" CssClass="FonteControlesASP"></asp:TextBox></td>
                <td><asp:ImageButton runat="server" ID="btnNovoSetup" ImageUrl="~/Imagens/btnNovo.png" CssClass="GridSelectImage" OnClick="btnNovoSetup_Click" OnClientClick="return confirm('Quando criar uma nova Configuração de Ano Letivo, você estará encerrando o ano vigente. Isto afetará Emissão de Boletins, Tabela de Dias Não Letivos, Frequência dos Alunos, Notas e Turmas. Deseja criar a nova configuração?');" /></td>
            </tr>
    
            <tr>
                <td class="Caption">Data início</td>
                <td><asp:TextBox runat="server" ID="txtDataInicio" TextMode="Date" CssClass="FonteControlesASP" AutoPostBack="true" OnTextChanged="txtDataInicio_TextChanged"></asp:TextBox></td>
                <td class="Caption">Data término</td>
                <td><asp:TextBox runat="server" ID="txtDataTermino" TextMode="Date" CssClass="FonteControlesASP" AutoPostBack="true" OnTextChanged="txtDataTermino_TextChanged"></asp:TextBox></td>
                <td class="Caption">Dias letivos</td>
                <td><asp:TextBox runat="server" ID="txtDiasLetivos" Enabled="false" CssClass="FonteControlesASP"></asp:TextBox></td>
                <td class="Caption">C.H.A. aula</td>
                <td><asp:TextBox runat="server" ID="txtHorasAnuaisEquivalentesAulaSemanal" TextMode="Number" CssClass="FonteControlesASP" AutoPostBack="true" OnTextChanged="txtHorasAnuaisEquivalentesAulaSemanal_TextChanged"></asp:TextBox></td>
            </tr>
            
            <tr>
                <td class="Caption">Duração aula</td>
                <td><asp:TextBox runat="server" ID="txtDuracaoAula" TextMode="Number" CssClass="FonteControlesASP" AutoPostBack="true" OnTextChanged="txtDuracaoAula_TextChanged"></asp:TextBox></td>
                <td class="Caption">Aulas no período</td>
                <td><asp:TextBox runat="server" ID="txtAulasDiarias" TextMode="Number" CssClass="FonteControlesASP" AutoPostBack="true" OnTextChanged="txtAulasDiarias_TextChanged"></asp:TextBox></td>
                <td class="Caption">Média mínima</td>
                <td><asp:TextBox runat="server" ID="txtMediaMinima" CssClass="FonteControlesASP" AutoPostBack="true" OnTextChanged="txtMediaMinima_TextChanged"></asp:TextBox></td>
                <td class="Caption">Limite aulas/prof</td>
                <td><asp:TextBox runat="server" ID="txtLimiteAulasSemanaisProfessor" TextMode="Number" CssClass="FonteControlesASP" AutoPostBack="true" OnTextChanged="txtLimiteAulasSemanaisProfessor_TextChanged"></asp:TextBox></td>
            </tr>
        </table>

     

    Quando clico no botão indicado acima, são disparados os eventos TextChanged das datas indicadas acima, sendo que, durante o Debug, o TextChanged é disparado antes de ir para o código do botão.

    Agradeço toda ajuda.

    segunda-feira, 9 de abril de 2018 22:02

Respostas

  • Lucio,

    Eu já havia retirado o PostBack e o problema persistia.

    O problema foi resolvido trocando o Attributes.Add pela propriedade Text.

    A solução do problema anterior, na verdade, não foi utilizar o Attributes.Add, mas sim a formatação do controle que deve ser yyyy-MM-dd

    Farei a correção no outro post.

    Obrigado.

    • Marcado como Resposta Andrey G Santos sexta-feira, 13 de abril de 2018 05:37
    sexta-feira, 13 de abril de 2018 05:37

Todas as Respostas

  • Boa tarde, Andrey G Santos. Tudo bem?

    Obrigado por usar o fórum MSDN.

    Conseguiu algum avanço no teu caso? Se ainda não, o que falta?

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 10 de abril de 2018 21:30
    Moderador
  • Boa noite Filipe.

    Infelizmente continuo sem avanço neste problema. Não entendo a razão de apenas os TextChanged dos campos das datas serem acionados sem sofrerem qualquer alteração. 

    terça-feira, 10 de abril de 2018 21:34
  • Oi Lucio,

    O botão não altera qualquer valor dos controles no formulário. Ele preenche uma instância da classe para gravar um setup em branco e aguardar os novos valores a serem informados no formulário. Então, a cada alteração nos controles, é disparado o método de atualização do Setup Vigente (o novo Setup criado pelo botão, neste caso).

    Tive o cuidado de não alterar qualquer valor destes controles do formulário durante a inclusão de um novo Setup, justamente para evitar que o TextChanged fosse disparado. No entanto, com o click do botão, o TextChanged de ambos TextBoxes com as datas são acionados. O que é estranho para mim, é o fato de não disparar o TextChanged dos outros controles configurados da mesma forma no formulário.

    Ainda sigo sem entender este comportamento. Gostaria muito de manter o formulário com esta inteligência para ser semelhante ao APP que desenvolvi para dispositivos móveis.

    quarta-feira, 11 de abril de 2018 17:36
  • Uma nova informação sobre este problema. O evento TextChanged das duas datas é disparado no primeiro clique em qualquer controle que faça um submit. Depois disso o formulário tem o comportamento correto para TextChanged.

    quinta-feira, 12 de abril de 2018 02:17
  • Vamos lá...

    Existe um único lugar onde eu atualizo estes controles que é neste método abaixo:

    private void CarregaSetupAtivo()
            {
                clsSetupAnoLetivo.containerSetupAnoLetivo setupAtivo = new clsSetupAnoLetivo.containerSetupAnoLetivo();
    
                setupAtivo = setup.SetupVigente(Session["CentroEducacionalID"].ToString(), this);
    
                this.txtAnoVigente.Text = setupAtivo.Ano;
                this.txtAulasDiarias.Text = setupAtivo.QuantidadeAulasDiarias;
                //this.txtDataInicio.Attributes.Add("value", Convert.ToDateTime(setupAtivo.DataInicio).ToString("yyyy-MM-dd"));
                //this.txtDataTermino.Attributes.Add("value", Convert.ToDateTime(setupAtivo.DataTermino).ToString("yyyy-MM-dd"));
                this.txtDiasLetivos.Text = setupAtivo.DiasLetivos;
                this.txtDuracaoAula.Text = setupAtivo.AulaDuracao;
                this.txtHorasAnuaisEquivalentesAulaSemanal.Text = setupAtivo.HorasAnuaisEquivalentesAulaSemanal;
                this.txtLimiteAulasSemanaisProfessor.Text = setupAtivo.LimiteAulasSemanaisProfessor;
                this.txtMediaMinima.Text = setupAtivo.MediaMinima;
            }

    Eu comentei as duas linhas e, realmente, parou de ocorrer o problema. No entanto, eu chamo este método apenas em duas situações:

    • no Page Load, dentro do if(!IsPostBack), portanto só é executado na carga da página (e na carga da página o TextChanged não é disparado)
    • Após criar o novo Setup, então faz todo sentido porque quero carregar os novos valores dos campos e o TextChanged deve ser disparado para fazer o cálculo de dias que eu quero. 

    Fora isso, não há nenhum outro lugar. A única diferença é que uso Attributes.Add para os campos de datas porque o TextMode está ativo e não permite atribuir valores pela propriedade Text.

    A sensação que tenho, é que o TextChanged é disparado mas não é executado no Page Load e fica pronto para ser executado no primeiro clique da página que faça um submit.

    quinta-feira, 12 de abril de 2018 15:39
  • Lucio,

    Eu já havia retirado o PostBack e o problema persistia.

    O problema foi resolvido trocando o Attributes.Add pela propriedade Text.

    A solução do problema anterior, na verdade, não foi utilizar o Attributes.Add, mas sim a formatação do controle que deve ser yyyy-MM-dd

    Farei a correção no outro post.

    Obrigado.

    • Marcado como Resposta Andrey G Santos sexta-feira, 13 de abril de 2018 05:37
    sexta-feira, 13 de abril de 2018 05:37