Criar evento dinamicamente

02/01/2010

Amigos,

Tenho um form, e utilizo um metodo recursivo pra validá-lo, com errorprovider.
Segue abaixo o metodo:

 private void validaCamposBranco(Control control)
        {           
            foreach (Control c in control.Controls)
            {
                if (c is TextBox)
                {
                    if (c.Text.Trim() == "")
                    {
                        errorProvider1.SetError(c, ClassMessages.ErrorBlankValue);                       
                    }
                    else
                        errorProvider1.SetError(c, "");                 
                }

                ClassPersistStatic.sBlankValue += errorProvider1.GetError(c);

                if (c.HasChildren)
                    validaCamposBranco(c);
            }
        }

Com isso eu verifico se todos meus textbox estão preenchidos.

Funciona corretamente.



O que eu gostaria de fazer é um evento Leave para esses textbox, validando ao tirar o foco do controle.
Mas eu gostaria de fazer dinâmicamente, pois além de serem muitos textbox (só nesse form tem uns 30) a validação seria a mesma.
E além disso, usando a validação acima, se eu adicionar mais 200 textbox ao meu form, eles serão validados automaticamente, eu não precisarei modificar meu código.

Como eu faço pra criar eventos dinâmicos?
Eu poderia utilizar o foreach pra percorrer todos meus controles e adicionar o evento a eles, chamando a validação, mas não estou conseguindo.

Poderiam me dar uma ajuda?
Daniel Vieira

Daniel Vieira

Curtidas 0

Respostas

Fabio Mans

Fabio Mans

02/01/2010

Olá Daniel, faz um seguinte adicione um novo projeto do tipo Windows Forms Control Library, neste projeto adicione um textbox e um error provider, em seguida codifique o evento Leave ou qualquer outro evento que você achar necessário. Você vai perceber que na sua Toolbox irá ter este controle, basta arrastar o controle para o Form, veja um exemplo que eu fiz rapidamente.   using System;
using System.Windows.Forms; namespace MeuTextBox
{
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }         private void textBox1_Leave(object sender, EventArgs e)
        {
            if(textBox1.Text.Equals(""))
                errorProvider1.SetError(this,"Campo em branco");
        }
    }
}   Eu posso colocar n usercontrols no meu projeto, todos eles quando irão aprensentar a mensagem Campo em branco caso estejam em branco.   Espero ter ajudado.      
GOSTEI 0
Daniel Vieira

Daniel Vieira

02/01/2010

Deixa ver se entendi Fabio,

Esse projeto vai aparecer na minha toolbox, quando eu arrastar ele para o meu form ele vai validar meus textbox?

Mas nesse caso não vai validar pro controle chamado textbox1 apenas?
GOSTEI 0
Fabio Mans

Fabio Mans

02/01/2010

Não, cada textbox que você arrastar será um novo textbox. O que você está fazendo é um UserControl, já fez para Web? É igual, coloque tudo que você precisa nele, caso não tenha entendido eu te mando o projeto que fiz.   Fabio  
GOSTEI 0
Daniel Vieira

Daniel Vieira

02/01/2010

Hmm acho que agora entendi, ele será como um novo componente criado??

eu tenho alguns componentes criados, mas eu faço manualmente, crio uma classe dando override no componente, como no exemplo abaixo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace Materiais.Classes
{
    public class doubleTextBox : TextBox
    {
        protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
        {
            if (e.KeyCode == Keys.NumPad0 || e.KeyCode == Keys.NumPad1 || e.KeyCode == Keys.NumPad2
                || e.KeyCode == Keys.NumPad3 || e.KeyCode == Keys.NumPad4 || e.KeyCode == Keys.NumPad5
                || e.KeyCode == Keys.NumPad6 || e.KeyCode == Keys.NumPad7 || e.KeyCode == Keys.NumPad8
                || e.KeyCode == Keys.NumPad9
                || e.KeyCode == Keys.D0 || e.KeyCode == Keys.D1 || e.KeyCode == Keys.D2 || e.KeyCode == Keys.D3
                || e.KeyCode == Keys.D4 || e.KeyCode == Keys.D5 || e.KeyCode == Keys.D6 || e.KeyCode == Keys.D7
                || e.KeyCode == Keys.D8 || e.KeyCode == Keys.D9
                || e.KeyCode == Keys.Delete || e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return || e.KeyCode == Keys.Back
                || e.KeyCode == Keys.Tab
                || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right || e.KeyCode == Keys.Up || e.KeyCode == Keys.Down
                || e.KeyCode == Keys.End || e.KeyCode == Keys.Home || e.KeyCode == Keys.PageDown || e.KeyCode == Keys.PageUp
                || e.KeyCode == Keys.Oemcomma || e.KeyCode == Keys.Decimal || e.KeyCode == Keys.OemPeriod)               
            {
                e.SuppressKeyPress = false;
            }
            else
            {
                e.SuppressKeyPress = true;
            }
        }

        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            base.OnKeyPress(e);
            if (e.KeyChar == '.')
                e.KeyChar = ',';
        }

        protected override void OnGotFocus(EventArgs e)
        {
            base.OnGotFocus(e);
            this.BackColor = Color.Yellow;
        }

        protected override void OnLostFocus(EventArgs e)
        {
            base.OnLostFocus(e);
            this.BackColor = Color.Empty;
        }
    }
}


Eu faço manualmente, mas depois ele me cria o componente customizado.

Mas nesse componente eu não consegui trabalhar com eventos.
No seu exemplo eu conseguiria trabalhar com os eventos e inclusive ele viria com o error provider junto, seria por ae?
GOSTEI 0
Fabio Mans

Fabio Mans

02/01/2010

Isso mesmo, mas para o que você precisa um User Control é muito mais fácil, já fez um teste?   Fabio
GOSTEI 0
Daniel Vieira

Daniel Vieira

02/01/2010

Vou testar com o user control, parece que fica mais facil mesmo, ja vem com os eventos e tudo!

Ja posto se tiver dificuldades, vou utilizar seu exemplo
GOSTEI 0
Fabio Mans

Fabio Mans

02/01/2010

Olá Daniel posso fechar o chamado?   Obrigado.
GOSTEI 0
POSTAR