PARA TIRAR O FOCO DA TEXTBOX
Boa tarde, galera.
Estou pesquisando uma maneira de fazer com que eu faça uma rotina genérica para um determinado evento nas TextBox do meu formulário.
Digamos que eu tenha no formulário, 20 TextBoxes. Eu quero fazer com que quando a cor do fundo delas estiver em uma determinada cor, quando o usuário colocar o mouse em qualquer uma delas, ela não fique com o foco. é semelhante à Label.
Eu não gosto de utilizar o ReadOnly, pois o usuário não pode digitar, mas o foco fica na TextBox, não dá o efeito que eu gostaria.
Também não utilizo o Enabled=false, pois a TextBox fica com a cor da letra mais clara do que o preto, também não dá o efeito que eu gostaria.
Já fiz uma vez, criei uma TextBox que fica escondida no formulário, para receber o foco, aà no evento Enter eu jogo o foco para essa TextBox.
Só que dessa forma, eu tenho que fazer no evento Enter de todasa as 20 TextBoxes. E se eu tivesse um formulário com umas 50 TextBoxes? Ficariam muitas linhas de código à toa. Por isso eu gostaria de saber se há uma maneira de fazer uma rotina genérica em que eu apenas associasse o evento Enter de cada TextBox com essa rotina. Será que eu estou querendo demais? Ou existe maneira(s) de fazer isso e eu ainda não sei?
Agradeço a ajuda.
Estou pesquisando uma maneira de fazer com que eu faça uma rotina genérica para um determinado evento nas TextBox do meu formulário.
Digamos que eu tenha no formulário, 20 TextBoxes. Eu quero fazer com que quando a cor do fundo delas estiver em uma determinada cor, quando o usuário colocar o mouse em qualquer uma delas, ela não fique com o foco. é semelhante à Label.
Eu não gosto de utilizar o ReadOnly, pois o usuário não pode digitar, mas o foco fica na TextBox, não dá o efeito que eu gostaria.
Também não utilizo o Enabled=false, pois a TextBox fica com a cor da letra mais clara do que o preto, também não dá o efeito que eu gostaria.
Já fiz uma vez, criei uma TextBox que fica escondida no formulário, para receber o foco, aà no evento Enter eu jogo o foco para essa TextBox.
Só que dessa forma, eu tenho que fazer no evento Enter de todasa as 20 TextBoxes. E se eu tivesse um formulário com umas 50 TextBoxes? Ficariam muitas linhas de código à toa. Por isso eu gostaria de saber se há uma maneira de fazer uma rotina genérica em que eu apenas associasse o evento Enter de cada TextBox com essa rotina. Será que eu estou querendo demais? Ou existe maneira(s) de fazer isso e eu ainda não sei?
Agradeço a ajuda.
Você pode adicionar métodos de extensão aos seus controles:
Então, nos eventos que você quer controlar, use:
namespace ExtensionMethods
{
public static class Extensoes
{
public static bool CorVermelho(this MyTextbox txtBox)
{
return ((Textbox)txtBox).BackColor = Colors.Red; //caso a cor de fundo da textbox seja vermelho
}
}
}
Então, nos eventos que você quer controlar, use:
public void txtCodigo_click(object sender)
{
if (txtCodigo.CorVermelho())
this.SetFocus();
}
[ô]AO ENTRAR DOS TEXTBOX ABAIXO
Private Sub MYGOT(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _
TXT_CNPJ.GotFocus, TXT_RG.GotFocus, TXT_DESC.GotFocus, _
TXT_RAZAO.GotFocus, TXT_FANTASIA.GotFocus, TXT_LOGRA.GotFocus, TXT_NUMERO.GotFocus, _
TXT_CPL.GotFocus, TXT_BAIRRO.GotFocus, TXT_COD_MUN.GotFocus, TXT_CEP.GotFocus, _
TXT_DDD.GotFocus, TXT_FONE.GotFocus, TXT_FONE2.GotFocus, TXT_FONE3.GotFocus, TXT_FONE4.GotFocus, _
TXT_CONTATO.GotFocus, TXT_FAX.GotFocus, _
TXT_LOGRA_E.GotFocus, TXT_NUMERO_E.GotFocus, TXT_CPL_E.GotFocus, TXT_BAIRRO_E.GotFocus, _
TXT_COD_MUN_E.GotFocus, TXT_EMAIL.GotFocus, TXT_SITE.GotFocus, TXT_REF.GotFocus, _
TXT_LOGRA_C.GotFocus, TXT_NUMERO_C.GotFocus, TXT_CPL_C.GotFocus, _
TXT_BAIRRO_C.GotFocus, TXT_CEP_C.GotFocus
Dim Colori As Control
Colori = CType(sender, Control)
Colori.BackColor = Color.LightCyan
End Sub
[ô]AO SAIR DOS TEXTBOX ABAIXO
Private Sub MYLOST(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _
TXT_CNPJ.LostFocus, TXT_RG.LostFocus, TXT_DESC.LostFocus, _
TXT_RAZAO.LostFocus, TXT_FANTASIA.LostFocus, TXT_LOGRA.LostFocus, TXT_NUMERO.LostFocus, _
TXT_CPL.LostFocus, TXT_BAIRRO.LostFocus, TXT_COD_MUN.LostFocus, TXT_CEP.LostFocus, _
TXT_DDD.LostFocus, TXT_FONE.LostFocus, TXT_FONE2.LostFocus, TXT_FONE3.LostFocus, TXT_FONE4.LostFocus, _
TXT_CONTATO.LostFocus, TXT_FAX.LostFocus, _
TXT_LOGRA_E.LostFocus, TXT_NUMERO_E.LostFocus, TXT_CPL_E.LostFocus, TXT_BAIRRO_E.LostFocus, _
TXT_COD_MUN_E.LostFocus, TXT_EMAIL.LostFocus, TXT_SITE.LostFocus, TXT_REF.LostFocus, _
TXT_LOGRA_C.LostFocus, TXT_NUMERO_C.LostFocus, TXT_CPL_C.LostFocus, _
TXT_BAIRRO_C.LostFocus, TXT_CEP_C.LostFocus
Dim Descolori As Control
Descolori = CType(sender, Control)
Descolori.BackColor = Color.White
End Sub
Não precisa por nada nos eventos dos campos.
Private Sub MYGOT(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _
TXT_CNPJ.GotFocus, TXT_RG.GotFocus, TXT_DESC.GotFocus, _
TXT_RAZAO.GotFocus, TXT_FANTASIA.GotFocus, TXT_LOGRA.GotFocus, TXT_NUMERO.GotFocus, _
TXT_CPL.GotFocus, TXT_BAIRRO.GotFocus, TXT_COD_MUN.GotFocus, TXT_CEP.GotFocus, _
TXT_DDD.GotFocus, TXT_FONE.GotFocus, TXT_FONE2.GotFocus, TXT_FONE3.GotFocus, TXT_FONE4.GotFocus, _
TXT_CONTATO.GotFocus, TXT_FAX.GotFocus, _
TXT_LOGRA_E.GotFocus, TXT_NUMERO_E.GotFocus, TXT_CPL_E.GotFocus, TXT_BAIRRO_E.GotFocus, _
TXT_COD_MUN_E.GotFocus, TXT_EMAIL.GotFocus, TXT_SITE.GotFocus, TXT_REF.GotFocus, _
TXT_LOGRA_C.GotFocus, TXT_NUMERO_C.GotFocus, TXT_CPL_C.GotFocus, _
TXT_BAIRRO_C.GotFocus, TXT_CEP_C.GotFocus
Dim Colori As Control
Colori = CType(sender, Control)
Colori.BackColor = Color.LightCyan
End Sub
[ô]AO SAIR DOS TEXTBOX ABAIXO
Private Sub MYLOST(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _
TXT_CNPJ.LostFocus, TXT_RG.LostFocus, TXT_DESC.LostFocus, _
TXT_RAZAO.LostFocus, TXT_FANTASIA.LostFocus, TXT_LOGRA.LostFocus, TXT_NUMERO.LostFocus, _
TXT_CPL.LostFocus, TXT_BAIRRO.LostFocus, TXT_COD_MUN.LostFocus, TXT_CEP.LostFocus, _
TXT_DDD.LostFocus, TXT_FONE.LostFocus, TXT_FONE2.LostFocus, TXT_FONE3.LostFocus, TXT_FONE4.LostFocus, _
TXT_CONTATO.LostFocus, TXT_FAX.LostFocus, _
TXT_LOGRA_E.LostFocus, TXT_NUMERO_E.LostFocus, TXT_CPL_E.LostFocus, TXT_BAIRRO_E.LostFocus, _
TXT_COD_MUN_E.LostFocus, TXT_EMAIL.LostFocus, TXT_SITE.LostFocus, TXT_REF.LostFocus, _
TXT_LOGRA_C.LostFocus, TXT_NUMERO_C.LostFocus, TXT_CPL_C.LostFocus, _
TXT_BAIRRO_C.LostFocus, TXT_CEP_C.LostFocus
Dim Descolori As Control
Descolori = CType(sender, Control)
Descolori.BackColor = Color.White
End Sub
Não precisa por nada nos eventos dos campos.
Finalmente encontrei uma solução, uma luz no fim do túnel, quando eu já estava quase desistindo. E olha que eu não sou de desistir tão fácil.
Encontrei uma forma de fazer isso, criando uma classe TextBoxEstendida que herda da classe Textbox
Ele vai criar um novo componente na Toolbar. Mas se eu não quiser utilizar esse componente novo pois na minha tela já existem as Textbox e eu não quero ter que excluir todas e depois criar novamente, eu posso simplesmente, ir no Designer do formulário: Meu_Formulário.Designer.cs e onde a TextBox é instanciada pelo método InitializeComponent(), é só colocar:
E pronto. Era exatamente o efeito que eu gostaria.
Obrigado mais uma vez ao Kerplunk e ao Nilsontres pela disposição e boa vontade.
Abraços e um bom dia a todos.
Encontrei uma forma de fazer isso, criando uma classe TextBoxEstendida que herda da classe Textbox
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Loja.Classes
{
public class TextBoxExtended : TextBox
{
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_LBUTTONUP = 0x202;
private const int WM_LBUTTONDBLCLK = 0x203;
private const int WM_RBUTTONDOWN = 0x204;
private const int WM_RBUTTONUP = 0x205;
protected override void WndProc(ref Message m)
{
if (this.ReadOnly && !this.TabStop)
{
if (m.Msg == WM_LBUTTONDOWN || m.Msg == WM_LBUTTONUP ||
m.Msg == WM_LBUTTONDBLCLK || m.Msg == WM_RBUTTONDOWN ||
m.Msg == WM_RBUTTONUP)
{
m.Result = new IntPtr(1);
return;
}
}
base.WndProc(ref m);
}
}
}
Ele vai criar um novo componente na Toolbar. Mas se eu não quiser utilizar esse componente novo pois na minha tela já existem as Textbox e eu não quero ter que excluir todas e depois criar novamente, eu posso simplesmente, ir no Designer do formulário: Meu_Formulário.Designer.cs e onde a TextBox é instanciada pelo método InitializeComponent(), é só colocar:
this.textBox1 = new MeuNameSpace.TextBoxExtended();
E pronto. Era exatamente o efeito que eu gostaria.
Obrigado mais uma vez ao Kerplunk e ao Nilsontres pela disposição e boa vontade.
Abraços e um bom dia a todos.
Tópico encerrado , respostas não são mais permitidas