none
Criar um evento para todos TEXTBOX do meu projeto. RRS feed

  • Pergunta

  • Gostaria de alterar uma propriedade em todos TEXT BOX do meu projeto. O código que vou utilizar é este:

    textBox1.GotFocus += textBox1_GotFocus;
    textBox1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.textBox1_MouseClick);  
    
    
            private void textBox1_GotFocus(object sender, EventArgs e)
            {//DO TAB
                textBox1.SelectAll();
            }
            private void textBox1_MouseClick(object sender, MouseEventArgs e)
            {// DO CLICK DO MOUSE
                textBox1.SelectAll();
            }

    Ou seja, toda vez que um textbox for selecionado vai ser selecionado todas as linhas.

    Alguma ideia de como posso fazer isso? Pq ter que criar este evento para todos textbox em todas as telas vai dar muito trabalho.

    quinta-feira, 6 de junho de 2019 13:25

Respostas

  • Olá, tenta o código...

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                AllTextBox(this);
            }
    
            private void AllTextBox(Control c)
            {
                foreach (Control ctl in c.Controls)
                {
                    if (ctl.Controls.Count > 0)
                        AllTextBox(ctl);
                    if (ctl is TextBox)
                    {
                        ((TextBox)ctl).GotFocus += textBox_GotFocus;
                        ((TextBox)ctl).MouseClick += new System.Windows.Forms.MouseEventHandler(this.textBox_MouseClick);
                    }
                }
            }
    


    Se ajudou, marque como resposta! Obrigado.

    • Marcado como Resposta Eduardo Michetti segunda-feira, 10 de junho de 2019 11:43
    sexta-feira, 7 de junho de 2019 22:21

Todas as Respostas

  • Olá, tenta o código...

            private void textBox1_GotFocus(object sender, EventArgs e)
            {//DO TAB
                ((TextBox)sender).SelectAll();
            }
            private void textBox1_MouseClick(object sender, MouseEventArgs e)
            {// DO CLICK DO MOUSE
                ((TextBox)sender).SelectAll();
            }


    Se ajudou, marque como resposta! Obrigado.

    quinta-feira, 6 de junho de 2019 15:55
  • Ajudou muito, porém ainda tenho que declarar o eventos eventos para todos textbox:

                txtNomeEmp.GotFocus += textBox_GotFocus;
                txtNomeEmp.MouseClick += new System.Windows.Forms.MouseEventHandler(this.textBox_MouseClick);
                txtEnd.GotFocus += textBox_GotFocus;
                txtEnd.MouseClick += new System.Windows.Forms.MouseEventHandler(this.textBox_MouseClick);  

    Se não tiver outra forma esta sua já ajudou muito mesmo.


    quinta-feira, 6 de junho de 2019 18:23
  • e se não for te alugar muito tem como usar este evento o SeletcAll no masked text box e no NumericUpDown
    quinta-feira, 6 de junho de 2019 18:51
  • Olá Eduardo, tudo bm?

    Não conheço uma maneira 100% automática de resolver seu problema, mas pensei em duas soluções que ao menos vão reduzir a codificação necessária além de deixar a lógica da sua solução em um lugar só, ao invés de repetí-la a cada controle:

    1ª - Criar um novo tipo de controle que herda de TextBox e utilizá-lo no lugar dos controles originais.
    Vantagem: a lógica de seleção automática ficará só no seu novo controle.
    Desvantagem: você terá que substituir seus TextBox pelo novo controle.

    Algo mais ou menos assim:

    public class YourTextBox : TextBox
    {
        protected override void OnClick(EventArgs e)
        {
            this.SelectAll()
            base.OnClick(e);
        }
    }

    2ª - Colocar em cada form um método que percorre os controles do mesmo e sempre que um TextBox receber o foco, todo o texto será selecionado.

    Vantagem: ao invés de alterar cada controle da sua solução, você só precisará alterar os formulários.
    Desvantagem: em caso de mudança dessa lógica ou no caso dela não se aplicar a um TextBox específico, você terá que promover alterações em mais de um lugar, oque com o tempo pode deixar o código confuso.

    protected override void OnMouseEnter(System.EventArgs e)
    {
        TextBox ctl;
        foreach (var ctl in this.Controls)
        {
            if (ctl.Focused)
                ctl.Select(0, Len(ctl.Text));
        }
    }
    

    --**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--

    Se achar que minha resposta auxiliou de alguma forma, por favor clique em "útil" ou em "Marcar como resposta"

    --**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--**--

    quinta-feira, 6 de junho de 2019 18:59
  • Legal esta primeira opção é muito interessante vou passar a adotá-la para novas telas. E para as que estão prontas vou tentar a segunda opção, mas me ajuda, como chamaria este método, tentei colocar mas esta retornando erro:


    quinta-feira, 6 de junho de 2019 19:16
  • Olá, é que nem todos os Controls do seu Form são TextBox, tenta o código...

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                foreach (var ctl in this.Controls)
                {
                    if (ctl is TextBox)
                    {
                        ctl.GotFocus += textBox_GotFocus;
                        ctl.MouseClick += new System.Windows.Forms.MouseEventHandler(this.textBox_MouseClick);
                    }
                }
            }
    


    Se ajudou, marque como resposta! Obrigado.

    quinta-feira, 6 de junho de 2019 21:25
  • Desculpe a ignorância e ficar amolando, retornou este erro agora:

    https://ibb.co/2jV5fqP

    Teria que colocar alguma referencia no projeto

    Ele só da estas opções:

    https://ibb.co/NSJbzS3

    sexta-feira, 7 de junho de 2019 13:10
  • Olá Eduardo
    Coloca um breakpoint nessa linha que está dando a exception e analisa o objeto ctl.

    Outra dica complementar a resposta do csvilarim é que vc pode criar uma convenção de IDS para os seus controles, aí se algum textbox não seguir essa política como ele bem lembrou, você não usa essa convenção de id para ele.

    Por fim, observe que se nem todos os seus controles estão no mesmo nível, um foreach simples como vc fez não vai funcionar e neste caso vc terá que fazer uma versão recursiva ou iterativa que visite todos os controles,como por exemplo

    var controls;
    var ctrl;
    
    controls = this.Controls.
    
    while (control.Any()) { // enquanto a list possui ao menos um controle
    
      ctrl = controls.First();
    
      foreach(var ch in ctrl.Controls) {
    
        // sua lógica
    
       controls.Add(ch);
    
      }
    
      controls.RemoveAt(0);
    
    }

    Não esqueça de votar as respostas úteis.

    ATT

    • Sugerido como Resposta IgorFKModerator sexta-feira, 7 de junho de 2019 13:24
    sexta-feira, 7 de junho de 2019 13:23
  • deu estes erros

    sexta-feira, 7 de junho de 2019 13:50
  • Olá, é que no foreach a variável está definida como "var", mas tem q ser "TextBox", tenta o código...

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                foreach (var ctl in this.Controls)
                {
                    if (ctl is TextBox)
                    {
                        ((TextBox)ctl).GotFocus += textBox_GotFocus;
                        ((TextBox)ctl).MouseClick += new System.Windows.Forms.MouseEventHandler(this.textBox_MouseClick);
                    }
                }
            }


    Se ajudou, marque como resposta! Obrigado.


    sexta-feira, 7 de junho de 2019 13:53
  • Retorna este erro quando objeto não é textbox

    {"Não é possível converter um objeto do tipo 'System.Windows.Forms.Button' no tipo 'System.Windows.Forms.TextBox'."}

    Adaptando o código para este:

    foreach (Control ctl in this.Controls)
                {
                    if (ctl is TextBox)
                    {
                        ctl.GotFocus += textBox_GotFocus;
                        ctl.MouseClick += new System.Windows.Forms.MouseEventHandler(this.textBox_MouseClick);
                    }
                }

    Ele da certo mas não acha nenhum textbox. Parece que ele encontra apenas as tabpages. Pelo fato dos textboxs estarem dentro de uma tabpage significa que tenha que adaptar algo neste código?

    sexta-feira, 7 de junho de 2019 14:06
  • Olá, tenta o código...

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                foreach (var ctl in this.Controls)
                {
                    if (ctl is TextBox)
                    {
                        ((TextBox)ctl).GotFocus += textBox_GotFocus;
                        ((TextBox)ctl).MouseClick += new System.Windows.Forms.MouseEventHandler(this.textBox_MouseClick);
                    }
                }
            }


    Se ajudou, marque como resposta! Obrigado.

    sexta-feira, 7 de junho de 2019 14:07
  • é exatamente o que falei, o código que enviei anteriormente e este seu funcionam, criei um TextBox fora e deu certo.

    Mas os códigos não enxergam os textbox dentro da tabpage.

    sexta-feira, 7 de junho de 2019 14:16
  • deu estes erros

    var controls; // uma coleção de controles (é a coleção em que vc vai iterar)
    // você pode fazer por exemplo List<Control> controls;
    
    var ctrl; // é a variável de iteração
    
    controls = this.Controls; // obtém todos os controles filhos do seu form (se você declarar uma lista pode fazer controls.AddRange(this.Controls);
    
    while (control.Any()) { // enquanto a list possui ao menos um controle
    
      ctrl = controls.First(); // o método First() retorna o primeiro item de uma coleção (é o mesmo que fazer controls[0];
    
      foreach(var ch in ctrl.Controls) { // esse foreach itera nos filhos do seu controle atual (como vc adiciona os filhos de cada controle na lista, em algum momento irá tê-los como o controle atual e por sua vez adicionará seus filhos e assim por diante, isso garante que vc visite todos os controles do form)
    
        // sua lógica
    
       controls.Add(ch);
    
      }
    
      controls.RemoveAt(0); // aqui você remove o primeiro controle da lista, que é o controle que você acabou de analisar, porém os filhos deste controle ainda permanecem na lista para que você os analise posteriormente
    
    }


    OBS: usando o objeto genérico control você não receberá exceções do tipo {"Não é possível converter um objeto do tipo 'System.Windows.Forms.Button' no tipo 'System.Windows.Forms.TextBox'."}

    Para saber se o controle é um TextBox basta chamar ctrl.GetType()

    sexta-feira, 7 de junho de 2019 15:14
  • Ainda não consegui
    sexta-feira, 7 de junho de 2019 15:43
  • Verdade.

    Esse objeto ControlCollection não implementa o método Any;

    Faz uma lista comum, como te falei no segundo exemplo:

    var controls = new List<Control>();
    
    if (this.Controls != null)
    
    foreach(var c in this.Controls)
      controls.Add(c);
    
    

    daqui em diante você segue igual

    mas pra simplificar pode fazer da seguinte forma:

    while (controls.Count() > 0) { // enquanto a lista possui ao menos um controle
    
      ctrl = controls[0];
    
      foreach(var ch in ctrl.Controls) { // esse foreach itera nos filhos do seu controle atual (como vc adiciona os filhos de cada controle na lista, em algum momento irá tê-los como o controle atual e por sua vez adicionará seus filhos e assim por diante, isso garante que vc visite todos os controles do form)
    
        // sua lógica
    
       controls.Add(ch);
    
      }
    
      controls.RemoveAt(0); // aqui você remove o primeiro controle da lista, que é o controle que você acabou de analisar, porém os filhos deste controle ainda permanecem na lista para que você os analise posteriormente
    
    }



    sexta-feira, 7 de junho de 2019 17:49
  • A única forma que consegui rodar foi assim, mas na hora que ctrl = controls[0]; da erro.

    De qualquer forma deste jeito consegui fazer:

    foreach (var ctl in this.Controls)
                {
                    if (ctl is TextBox)
                    {
                        ((TextBox)ctl).GotFocus += textBox_GotFocus;
                        ((TextBox)ctl).MouseClick += new System.Windows.Forms.MouseEventHandler(this.textBox_MouseClick);
                    }
                }

    ... que o LeonardoBarros passou. Mas ele não enxerga os controles que estão dentro da tabPage.

    sexta-feira, 7 de junho de 2019 18:51
  • Olá, tenta o código...

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                AllTextBox(this);
            }
    
            private void AllTextBox(Control c)
            {
                foreach (Control ctl in c.Controls)
                {
                    if (ctl.Controls.Count > 0)
                        AllTextBox(ctl);
                    if (ctl is TextBox)
                    {
                        ((TextBox)ctl).GotFocus += textBox_GotFocus;
                        ((TextBox)ctl).MouseClick += new System.Windows.Forms.MouseEventHandler(this.textBox_MouseClick);
                    }
                }
            }
    


    Se ajudou, marque como resposta! Obrigado.

    • Marcado como Resposta Eduardo Michetti segunda-feira, 10 de junho de 2019 11:43
    sexta-feira, 7 de junho de 2019 22:21
  • Funcionou perfeitamente. Muito obrigado pela atenção de todos. Vou deixar o código completo para quem tiver a mesma dúvida.

            public Cgeral()
            {
                InitializeComponent();            
                AllTextBox(this);
            }
    
            private void AllTextBox(Control c)
            {
                foreach (Control ctl in c.Controls)
                {
                    if (ctl.Controls.Count > 0)
                        AllTextBox(ctl);
                    if (ctl is TextBox)
                    {
                        //CASO QUEIRA USAR A MESMA LÓGICA PARA LIMPAR TODOS OS CAMPOS
                        //((TextBox)ctl).Text = String.Empty;
                        ((TextBox)ctl).GotFocus += textBox_GotFocus;
                        ((TextBox)ctl).MouseClick += new System.Windows.Forms.MouseEventHandler(this.textBox_MouseClick);
                    }
                }
            }
    
            private void textBox_GotFocus(object sender, EventArgs e)
            {//DO TAB
                ((TextBox)sender).SelectAll();
            }//DO TAB
            private void textBox_MouseClick(object sender, MouseEventArgs e)
            {// DO CLICK DO MOUSE
                ((TextBox)sender).SelectAll();
            }// DO CLICK DO MOUSE

    segunda-feira, 10 de junho de 2019 12:09