none
Quero fechar a tela de cadastro pelo ESC, mas com condição, caso o usuário esteja no meio do cadastro não feche. RRS feed

  • Pergunta

  • Olá, preciso de ajuda, quem puder ajudar, desde já agradeço.

    Quero fechar a tela de cadastro pelo ESC, mas com condição, caso o usuário esteja no meio do cadastro não feche.

    Fiz assim, mas não funciona, lembrando que o Keypreview da tela já esta TRUE

    private void CadastroCategoria_KeyPress(object sender, KeyPressEventArgs e)
            {
                if ((e.KeyChar == 27) && (btnNovo.Visible = true))
                {
                    this.Dispose();
                }
            }
    quarta-feira, 3 de junho de 2015 17:54

Respostas

  • Boa tarde André,

    o que eu fiz uma vez foi nos campos dos cadastros mapear o evento textchanged para input texts e click para checkbox, radio e dropdown.

    Dai eu setava uma variável local, por exemplo: blnDadosAlterados = true;

    Quando você passar pelo seu evento KeyPress do Form, vc deve fazer o seguinte:

    private bool blnDadosAlterados = false;
    
    private void CadastroCategoria_KeyPress(object sender, KeyPressEventArgs e)
    {
    	if ((e.KeyChar == 27) && (btnNovo.Visible = true)) {
    		if (!blnDadosAlterados) {
    			this.Dispose();
    		}
    	}
    }
    
    private void currencyTextBox_TextChanged(object sender, EventArgs e)
    {
    	blnDadosAlterados = true;
    }

    quarta-feira, 3 de junho de 2015 18:40
  • Boa tarde André,

    o que eu fiz uma vez foi nos campos dos cadastros mapear o evento textchanged para input texts e click para checkbox, radio e dropdown.

    Dai eu setava uma variável local, por exemplo: blnDadosAlterados = true;

    Quando você passar pelo seu evento KeyPress do Form, vc deve fazer o seguinte:

    private bool blnDadosAlterados = false;
    
    private void CadastroCategoria_KeyPress(object sender, KeyPressEventArgs e)
    {
    	if ((e.KeyChar == 27) && (btnNovo.Visible = true)) {
    		if (!blnDadosAlterados) {
    			this.Dispose();
    		}
    	}
    }
    
    private void currencyTextBox_TextChanged(object sender, EventArgs e)
    {
    	blnDadosAlterados = true;
    }

    Concordo com o André, sobre obrigar os usuários a se cadastrarem.

    Porém você ainda poderá complementar o código KeyPress da seguinte forma:

    	if ((e.KeyChar == 27) && (btnNovo.Visible = true)) {
    		if (!blnDadosAlterados) {
    			if (MessageBox.Show("Atenção, existem dados sendo cadastrados, deseja sair sem grava-los ?", "Fechar Tela", MessageBoxButtons.YesNo) == DialogResult.Yes)
    			{
    				this.Dispose();
    			}
    		}
    	}

    quarta-feira, 3 de junho de 2015 19:01
  • André

    É interessante analisar porque as pessoas apertam ESC para sair no momento do cadastro. 

    Até porque você não pode obrigar todos para ter um cadastro. Existe alguma coisa que estão desistindo, seria bom analisar. Talvez pode ser a quantidade dados ou coisa parecida.

    Outra parte importante é: se você não deixar o ESC eles vão sair de outra maneira. Usuário é sempre criativo com isso.


    Espero ter ajudado. Se ajudei, favor marcar no fórum falando que foi útil.

    Mauricio Junior - Comunidade www.ecode10.com

    quarta-feira, 3 de junho de 2015 18:52
  • Cara boa tarde, fiz um trecho de código que talvez te ajude.

    Esse trecho faz o seguinte, ele analisa os campos de texto no formulário e se algum estiver com dado preenchido ele não permite a saída, caso os campos estejam em branco ele sai.

    Fiz em WPF

    bool cadastrando = false; private void Window_KeyUp_1(object sender, KeyEventArgs e) { if (e.Key == Key.Escape) {

    //faz uma varredura pelo grid (ou escolha um layout) foreach (TextBox componente in gride.Children) {

    //verifica se o campo não está vazio if (componente.Text != string.Empty) { cadastrando = true; break; } else { cadastrando = false; } } //define se ele continua ou fecha a janela if (cadastrando) { MessageBox.Show("Cadastrando"); } else { MessageBox.Show("Finalizando"); } } }

    Espero ter ajudado, abraço!
    quarta-feira, 3 de junho de 2015 18:58
  • Bom dia,

    Use o this.close.

    O evento Closing é disparado toda vez que a janela da início ao fechamento.

    Abaixo um código que fiz, siga o modelo:

    Essa rotina é básica.. tem que ser refinada, para outros controles do form.

    	//Flag para inficar se está salvo ou não
            bool Salvou;
    
            private void Form1_Load(object sender, EventArgs e)
            {
                Salvou = true; //Está salvo, pois ainda não houve alteração.
                atribuirEventoHandlerTextBox();
            }
    
            private void salvarButton_Click_1(object sender, EventArgs e)
            {
                // comandos....
                //    .
                //    .
                //    .
    
                //Salvou os dados.
                Salvou = true;
            }
    
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                //Salvou?  Não, os dados ainda não foram salvos, não vou fechar a janela.
                if (!Salvou)
                {
                    MessageBox.Show("Os dados ainda não foram salvos!");
                    e.Cancel = true;
                }
            }
    
            //Trata o evento Handler
            private void MudouTextoEventHandler(object sender, EventArgs e)
            {
                TextBox tb = sender as TextBox;
                if (tb != null)
                {
                    //Houve mudança em um dos campos TextBox, então "seta" com onão salvo.
                    Salvou = false;
                }
            }
    
    
            //Atribuir eveto Handler aos Textbox
            private void atribuirEventoHandlerTextBox()
            {
                foreach (Control controle in this.Controls)
                {
                    if (controle is TextBox)
                    {
                        controle.TextChanged += MudouTextoEventHandler;
                    }
                }
            }

    Espero que o ajude.


    Anderson


    sexta-feira, 5 de junho de 2015 13:20

Todas as Respostas

  • André

    É interessante analisar porque as pessoas apertam ESC para sair no momento do cadastro. 

    Até porque você não pode obrigar todos para ter um cadastro. Existe alguma coisa que estão desistindo, seria bom analisar. Talvez pode ser a quantidade dados ou coisa parecida.

    Outra parte importante é: se você não deixar o ESC eles vão sair de outra maneira. Usuário é sempre criativo com isso.


    Espero ter ajudado. Se ajudei, favor marcar no fórum falando que foi útil.

    Mauricio Junior - Comunidade www.ecode10.com

    quarta-feira, 3 de junho de 2015 18:52
  • Cara boa tarde, fiz um trecho de código que talvez te ajude.

    Esse trecho faz o seguinte, ele analisa os campos de texto no formulário e se algum estiver com dado preenchido ele não permite a saída, caso os campos estejam em branco ele sai.

    Fiz em WPF

    bool cadastrando = false; private void Window_KeyUp_1(object sender, KeyEventArgs e) { if (e.Key == Key.Escape) {

    //faz uma varredura pelo grid (ou escolha um layout) foreach (TextBox componente in gride.Children) {

    //verifica se o campo não está vazio if (componente.Text != string.Empty) { cadastrando = true; break; } else { cadastrando = false; } } //define se ele continua ou fecha a janela if (cadastrando) { MessageBox.Show("Cadastrando"); } else { MessageBox.Show("Finalizando"); } } }

    Espero ter ajudado, abraço!
    quarta-feira, 3 de junho de 2015 18:58
  • Bom dia,

    Use o this.close.

    O evento Closing é disparado toda vez que a janela da início ao fechamento.

    Abaixo um código que fiz, siga o modelo:

    Essa rotina é básica.. tem que ser refinada, para outros controles do form.

    	//Flag para inficar se está salvo ou não
            bool Salvou;
    
            private void Form1_Load(object sender, EventArgs e)
            {
                Salvou = true; //Está salvo, pois ainda não houve alteração.
                atribuirEventoHandlerTextBox();
            }
    
            private void salvarButton_Click_1(object sender, EventArgs e)
            {
                // comandos....
                //    .
                //    .
                //    .
    
                //Salvou os dados.
                Salvou = true;
            }
    
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                //Salvou?  Não, os dados ainda não foram salvos, não vou fechar a janela.
                if (!Salvou)
                {
                    MessageBox.Show("Os dados ainda não foram salvos!");
                    e.Cancel = true;
                }
            }
    
            //Trata o evento Handler
            private void MudouTextoEventHandler(object sender, EventArgs e)
            {
                TextBox tb = sender as TextBox;
                if (tb != null)
                {
                    //Houve mudança em um dos campos TextBox, então "seta" com onão salvo.
                    Salvou = false;
                }
            }
    
    
            //Atribuir eveto Handler aos Textbox
            private void atribuirEventoHandlerTextBox()
            {
                foreach (Control controle in this.Controls)
                {
                    if (controle is TextBox)
                    {
                        controle.TextChanged += MudouTextoEventHandler;
                    }
                }
            }

    Espero que o ajude.


    Anderson


    sexta-feira, 5 de junho de 2015 13:20
  • obrigado amigos... deu certo aqui.... grande abraco a todos

    sexta-feira, 1 de janeiro de 2016 18:08