web-dev-qa-db-fra.com

Comment supprimer le focus d'une TextBox dans WinForms?

Je dois supprimer le focus de plusieurs TextBox. J'ai essayé d'utiliser:

textBox1.Focused = false;

Sa valeur de propriété ReadOnly est true.

J'ai ensuite essayé de définir le focus sur le formulaire, de manière à le supprimer de toutes les zones de texte, mais cela ne fonctionne pas non plus:

this.Focus();

et la fonction retourne false quand une zone de texte est sélectionnée.

Alors, comment puis-je supprimer le focus d'une zone de texte?

104
Callum Rogers

Vous avez besoin d'un autre contrôle de mise au point pour déplacer le focus.

Notez que vous pouvez définir le focus sur une étiquette. Vous voudrez peut-être envisager où vous voulez que la touche [Tab] se porte ensuite.

Notez également que vous ne pouvez pas le définir sur le formulaire. Les contrôles de conteneur tels que Form et Panel transmettent le focus à leur premier contrôle enfant. Quelle pourrait être la TextBox dont vous vouliez qu'elle s'éloigne.

107
Henk Holterman

Se concentrer sur le label n'a pas fonctionné pour moi, faire quelque chose comme label1.Focus() non? la zone de texte a toujours le focus lors du chargement du formulaire, bien que j'aie essayé Velociraptors répondre a fonctionné pour moi, en définissant le contrôle Active du formulaire sur l'étiquette de la manière suivante:

private void Form1_Load(object sender, EventArgs e)  
{ 
    this.ActiveControl = label1;       
}
58
WhySoSerious

Vous pouvez ajouter le code suivant:

this.ActiveControl = null;  //this = form
42
FTheGodfather

Essayez de désactiver et d'activer la zone de texte.

31
Spencer Ruport

Vous pouvez également définir la propriété de formulaires activecontrol sur null comme

ActiveControl = null;
21
marcigo36

Focus définit le focus d'entrée, aussi sa configuration sur le formulaire ne fonctionnera pas car les formulaires n'acceptent pas les entrées. Essayez de définir la propriété ActiveControl du formulaire sur un autre contrôle. Vous pouvez également utiliser Select pour sélectionner un contrôle spécifique ou SelectNextControl pour sélectionner le contrôle suivant dans l'ordre de tabulation.

8
Velociraptors

Essaye celui-là:

Premier ordre de tabulation.

Ensuite, dans l'événement de chargement de formulaire, nous pouvons envoyer une application par touche de programmation à l'application. Donc, cette application donnera le focus au 1er contrôle dans l’ordre des tabulations.

en charge de forme même écrire cette ligne.

SendKeys.Send("{TAB}");

Cela a fonctionné pour moi.

7
charith rasanga

Ce post m'a amené à faire ceci:

ActiveControl = null;

Cela me permet de capturer toutes les entrées au clavier au plus haut niveau sans que d'autres contrôles ne deviennent fous.

4
Kristopher Ives

J'ai trouvé une bonne alternative! Cela fonctionne mieux pour moi, sans mettre l'accent sur autre chose.

Essayez ça:

private void richTextBox_KeyDown(object sender, KeyEventArgs e)
{    
    e.SuppressKeyPress = true;
}
2
kaspi

Il semble que je n'ai pas à mettre l'accent sur d'autres éléments. Sur une application Windows Phone 7, j'utilise la méthode Focus pour supprimer le focus d'une zone de texte.

Donner la commande suivante ne mettra le focus sur rien:

void SearchBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        Focus();
    }
}

http://msdn.Microsoft.com/en-us/library/system.windows.forms.control.focus.aspx

Cela a fonctionné pour moi, mais je ne sais pas pourquoi cela n'a pas fonctionné pour vous: /

2
Bhawk1990

Une solution simple serait de tuer le focus, créez simplement votre propre classe:

public class ViewOnlyTextBox : System.Windows.Forms.TextBox {
    // constants for the message sending
    const int WM_SETFOCUS = 0x0007;
    const int WM_KILLFOCUS = 0x0008;

    protected override void WndProc(ref Message m) {
        if(m.Msg == WM_SETFOCUS) m.Msg = WM_KILLFOCUS;

        base.WndProc (ref m);
    }
}
2
VladL

Je l'ai fait sur mon contrôle personnalisé, j'ai fait ceci surFocus ()

this.Parent.Focus();

Donc, si texbox est focalisé - il focalise instantanément le parent de zone de texte (formulaire, ou panneau ...). C'est une bonne option si vous voulez faire cela sur un contrôle personnalisé.

2
Tommix
    //using System;
    //using System.Collections.Generic;
    //using System.Linq;

    private void Form1_Load(object sender, EventArgs e)
    {
        FocusOnOtherControl(Controls.Cast<Control>(), button1);
    }

    private void FocusOnOtherControl<T>(IEnumerable<T> controls, Control focusOnMe) where T : Control
    {
        foreach (var control in controls)
        {
            if (control.GetType().Equals(typeof(TextBox)))
            {
                control.TabStop = false;
                control.LostFocus += new EventHandler((object sender, EventArgs e) =>
                {                     
                    focusOnMe.Focus();
                });
            }
        }
    }
1
Torus

Si tout ce que vous voulez, c’est l’effet optique que la zone de texte n’a pas de sélection bleue sur tout son contenu, il suffit de sélectionner aucun texte:

textBox_Log.SelectionStart = 0;
textBox_Log.SelectionLength = 0;
textBox_Log.Select();

Après cela, lors de l'ajout de contenu avec .Text += "...", aucune sélection bleue ne sera affichée.

0
Roland

La façon dont je le contourne consiste à placer tous mes contrôles Winform. Je crée toutes les étiquettes et les contrôles de forme non sélectionnés en ordre de tabulation 0, puis mon premier contrôle en ordre de tabulation 2, puis j'incrémente l'ordre de chaque contrôle sélectionnable de 1, donc 3, 4, 5, etc.

De cette façon, lorsque mes Winforms démarrent, la première zone de texte n'a pas le focus!

0
CosineCuber

Veuillez essayer de définir TabStop sur False pour votre contrôle de vue non ciblé.

Pour par exemple:

txtEmpID.TabStop = false;
0
Shaheer

vous pouvez le faire par deux méthodes

  • faites juste les propriétés "TabStop" de la zone de texte désirée à false maintenant, il ne se focalisera pas même si vous avez un champ de texte
  • faites glisser deux zone de texte

    1. rendre visible celui sur lequel vous ne voulez pas de foucus qui est textbox1
    2. rendre le deuxième invisible et aller aux propriétés de ce champ de texte et sélectionner

valeur tabindex à 0 de textbox2

  1. et sélectionnez le tabindex de votre textbox1 à 1 maintenant il ne se concentrera pas sur textbox1
0
Adiii