Hints/Tips úteis para TextBox
Este projeto mostrará um modo diferente de:
· permitir só valores inteiros em um TextBox;
· permitir só caracteres válidos e impedir caracteres inválidos em um TextBox;
· realçar com cor endereços de e-mail em um TextBox;
· verificar se um endereço de e-mail é ou não válido,
Via a classe System.Text.RegularExpressions.Regex().
Também mostrará como podemos usar ErrorProvider e ToolTip, quando o usuário tentar inserir valores inválidos em um TextBox.
Figura 1.
Código e Como trabalha
Usamos três TextBox: textboxInteger é para valores inteiros; textboxEmail para endereços de e-mail e textboxChars para valores caráter. Comecemos com o TextBox 'textboxInteger'.
Como mencionado antes, esse TextBox somente permite valores inteiros. Não serão aceitos outros caracteres. Abaixo temos o método para entrada de inteiros:
private void textboxInteger_KeyPress(object sender,
System.Windows.Forms.KeyPressEventArgs e)
{
if (!Char.IsDigit(e.KeyChar) && e.KeyChar !=(char)8)
{
this.statusBar1.Text="incorrect key...";
e.Handled = true; // o carater nao e passado para o control(TextBox)
} else
this.statusBar1.Text="OK..";
}
Como podemos observar, verificamos se o caráter digitado no TextBox é um dígito decimal ou uma tecla backspace para apagar caracteres. Se não for, não passaremos este caráter para o controle para que não apareça no TextBox(e.Handled=true). Caso contrário, exibimos o texto "OK..." na status bar, o que significa que foi digitado um caráter válido.
TextBox 'textboxChars'
Queremos aqui evitar a entrada de certos caracteres inválidos (i.e., 'a', 'b', 'c', '#', '*', '1', etc.). Implementamos assim três métodos em Form1.cs:
mTextboxCharsKeyPressWithForeach
mTextboxCharsKeyPressWithIF
mTextboxCharsKeyPressWithSwitch
private void mTextboxCharsKeyPressWithSwitch(object sender,
System.Windows.Forms.KeyPressEventArgs e)
{
this.statusBar1.Text="OK...";
switch(e.KeyChar)
{
case 'a':
case 'b':
case 'c':
case '#':
case '*':
case '1': //este é um carater, não um inteiro
e.Handled=true; //indica que o evento esta sendo tratado.
this.errorProvider1.SetError(this.textboxChars,
"not allowed chars: 'a','b','c','#','*','1'");
this.statusBar1.Text="not allowed char..."+e.KeyChar;
break;
default:
//limpar o erro
this.errorProvider1.SetError(this.textboxChars, "");
break;
} //fim do switch
}
Se os caracteres digitados forem 'a', 'b', 'c', '#', '*', '1', etc., então usamos um controle ErrorProvider e um ToolTip no TextBox. Um ícone de erro aparece próximo ao TextBox. Se passarmos o ponteiro do mouse por cima do ícone de erro, aparecerá um tool tip exibindo a mensagem erro.
TextBox 'textboxEmail'
Assim que for digitado um endereço de e-mail correto, mudarão as cores BackColor e ForeColor do TextBox, para amarelo e azul sublinhado respectivamente, junto com um MessageBox mostrando o nome de usuário e do host. Se nada for digitado após o caráter ‘@’, exibirá uma mensagem comunicando que não é um endereço de e-mail válido. Vejamos o método para o TextBox 'textboxEmail':
private void textboxEmail_TextChanged(object sender,
System.EventArgs e)
{
if (this.textboxEmail.Text.IndexOf("@") != -1
&& this.textboxEmail.Text.IndexOf(".") != -1)
{
/* enderco de e-mail correto */
this.textboxEmail.BackColor=Color.Yellow;
this.textboxEmail.ForeColor=Color.Blue;
this.textboxEmail.Font=new Font("Arial",
10, FontStyle.Underline);
}
else
{
// voltando ao status do TextBox antigo/previo
this.textboxEmail.BackColor=Color.White;
this.textboxEmail.ForeColor=Color.Black;
this.textboxEmail.Font=new Font("Arial",
10, FontStyle.Regular);
}
}
O método IndexOf retorna um valor inteiro que indica o começo do substring dentro do objeto String. Se o substring não for achado, será retornado -1. Se o endereço de e-mail for válido, serão mudados BackColor e o ForeColor, além do FontStyle para "FontStyle.Underline". Caso contrário retornará ao estilo anterior.
Para verificar se o endereço de e-mail é ou não válido, uso um padrão de expressão regular com para validar o mesmo. Abaixo está método.
private void textboxEmail_Validating(object sender,
System.ComponentModel.CancelEventArgs e)
{
Regex emailregex = new Regex("(?[^@]+)@(?.+)");
Match mmatch = emailregex.Match(this.textboxEmail.Text);
if ( mmatch.Success )
{
MessageBox.Show("UserName: " +
mmatch.Groups["user"].Value+"\n"+"HostName: " +
mmatch.Groups["host"].Value,"E-Mail Information");
this.statusBar1.Text=""; //limpar StatusBar
}
else
{
MessageBox.Show("invalid e-mail address...","E-Mail Information");
e.Cancel=true; // nao sair do TextBox. Tentar novamente.
}
}
O objeto Match retorna mesmo que não tenha encontrado um casamento no string fonte. A propriedade Success, nos permite decidir se continuamos processando o objeto Match ou exibimos uma mensagem de erro. Se bem sucedido, exibimos os named groups do "user" e do "host" da coleção Groups do objeto Match. Caso contrário tentamos novamente. Devemos nos assegurar de que a primeiro metade do string não contém um caráter ‘@’.
Conclusão
Projetei este programa para demonstrar os aspectos fundamentais para os novatos. Quem sabe os peritos possam fazer bom uso de alguns hints/tips.
Aproveite e boa codificação!