PARA TIRAR O FOCO DA TEXTBOX

PERCIFILHO 24/02/2016 15:02:33
#458163
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.
KERPLUNK 24/02/2016 16:21:10
#458169
Você pode adicionar métodos de extensão aos seus controles:

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();
}

NILSONTRES 24/02/2016 16:33:09
#458173
[ô]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.
PERCIFILHO 25/02/2016 08:09:38
#458187
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

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