Usuário com melhor resposta
TextChanged disparado sem motivo

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.
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
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.
-
-
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.
-
-
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.
-
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