2008-12-17 12 views
2

Je veux avoir un TextBox qui accepte la touche TAB (et place un TAB, ASCII 0x09, \ t dans la zone de texte) au lieu de passer au contrôle suivant . Le TextBox a une propriété AcceptsTab, que j'ai définie à true mais cela ne donne pas le résultat souhaité. Il s'avère que la propriété AcceptsTab ne fonctionne que si Multiline est définie sur true. Cependant, je veux avoir une TextBox d'une ligne qui n'accepte pas les nouvelles lignes.Autoriser les utilisateurs à insérer un TAB dans un TextBox mais pas de retour chariot

Répondre

4

Voici ce que vous faites. Créez votre propre classe qui hérite de TextBox. Dans le constructeur, définissez multiline sur true et AcceptsTab sur true. Ensuite, passer outre WndProc et utiliser ce code:

 protected override void WndProc(ref Message m) 
     { 
      if (m.Msg == (int)0x102 && m.WParam.ToInt32() == 13) 
      { 
       return; 
      } 

      base.WndProc(ref m); 
     } 

Cela bloque la touche entrée d'être acceptée et donc une nouvelle ligne ne sera pas créé. Hacky? oui, mais ça va marcher ..

EDIT: Je vais vous expliquer ce que fait ce code. Chaque formulaire et contrôle de Windows reçoit un message de Windows quand quelque chose se produit, comme la peinture, la touche, etc etc ... Dans ce cas, je cherche un message WM_CHAR (qui est 0x102) qui est le message qui indique à la TextBox la touche a été pressée. Si c'est le message, et le WParam == 13, cela signifie que l'entrée a été pressée, dans ce cas, retourner, ne rien faire. Sinon, reprenez comme prévu. Logique?

+0

Pouvez-vous ajouter quelques commentaires à la sienne pour expliquer ce qui se passe? –

0

Sel multilines à true et définissez la taille de ligne à 1. vous obtiendrez le résultat souhaité.

+0

Comment est-ce que je devrais aller et «placer la taille de ligne à 1»? – pbean

Questions connexes