Criar evento dinamicamente
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?
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
Curtidas 0
Respostas
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.
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
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?
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
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
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?
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
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
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
Ja posto se tiver dificuldades, vou utilizar seu exemplo
GOSTEI 0
Fabio Mans
02/01/2010
Olá Daniel posso fechar o chamado?
Obrigado.
GOSTEI 0