Comment supprimer le focus d'une zone de texte dans WinForms?

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

textBox1.Focused = false;

Sa valeur de propriété ReadOnly est true.

J'ai ensuite essayé de mettre l'accent sur le formulaire, afin de le supprimer de toutes les zones de texte, mais cela ne fonctionne pas non plus:

this.Focus();

Et la fonction retourne false lorsqu'une zone de texte est sélectionnée.

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

98
demandé sur Shin 2009-07-17 00:56:39

18 réponses

Vous avez besoin d'un autre contrôle focusable pour déplacer le focus.

Notez que vous pouvez définir le Focus sur une étiquette. Vous voudrez peut-être considérer où vous voulez que la touche [Tab] la prenne ensuite.

Notez également que vous ne pouvez pas le définir sur le formulaire. Les contrôles de conteneur comme le formulaire et le Panneau passeront le Focus sur leur premier contrôle enfant. Ce qui pourrait être la zone de texte dont vous vouliez qu'elle s'éloigne.

100
répondu Henk Holterman 2014-10-03 06:48:48

Se concentrer sur l'étiquette n'a pas fonctionné pour moi, faire quelque chose comme label1.Focus() n'est-ce pas? la zone de texte a toujours le focus lors du chargement du formulaire, mais en essayant Velociraptors réponse, a fonctionné pour moi, en définissant le contrôle actif du formulaire sur l'étiquette comme ceci:

private void Form1_Load(object sender, EventArgs e)  
{ 
    this.ActiveControl = label1;       
}
53
répondu WhySoSerious 2018-07-04 12:10:48

, Vous pouvez ajouter le code suivant:

this.ActiveControl = null;  //this = form
35
répondu FTheGodfather 2014-06-29 09:06:30

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

31
répondu Spencer Ruport 2009-07-16 20:59:17

, Vous pouvez également définir les formes activecontrol la propriété de null comme

ActiveControl = null;
16
répondu marcigo36 2015-08-26 08:08:46

Focus définit le focus d'entrée, donc le définir sur le formulaire ne fonctionnera pas car les formulaires n'acceptent pas l'entrée. Essayez de définir la propriété ActiveControl du formulaire sur un contrôle différent. 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
répondu Velociraptors 2009-07-16 21:16:35

Essayez celui-ci:

Configurez D'abord l'ordre des onglets.

Ensuite, dans l'événement de charge de formulaire, nous pouvons envoyer une touche de tabulation par programme à l'application. De sorte que l'application donnera le focus au 1er contol dans l'ordre des onglets.

Dans le formulaire charger même écrire cette ligne.

SendKeys.Send("{TAB}");

Cela a fonctionné pour moi.

7
répondu charith rasanga 2018-07-04 12:19:17

Ce post m'a amené à faire ceci:

ActiveControl = null;

Cela me permet de capturer toutes les entrées du clavier au niveau supérieur sans que les autres contrôles deviennent fous.

4
répondu Kristopher Ives 2014-03-29 05:46:44

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

Donner la commande suivante définira 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: /

3
répondu Bhawk1990 2012-03-10 17:50:23

Une solution simple serait de tuer le focus, il suffit de créer 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);
    }
}
3
répondu VladL 2013-09-10 10:31:12

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;
}
3
répondu kaspi 2014-01-28 22:14:43

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

this.Parent.Focus();

Donc, si texbox concentré-il se concentre instantanément textbox parent (formulaire, ou panneau...) C'est une bonne option si vous voulez faire cela sur le contrôle personnalisé.

3
répondu Tommix 2014-01-30 12:54:54
    //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();
                });
            }
        }
    }
2
répondu Torus 2014-04-06 21:36:14

La façon dont je le contourner est de placer tous mes contrôles winform. Je fais toutes les étiquettes et les contrôles winform non sélectionnables en tant qu'ordre de tabulation 0, puis Mon premier contrôle en tant qu'ordre de tabulation 2, puis incrémente l'ordre de chaque contrôle sélectionnable par 1, donc 3, 4, 5 etc...

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

1
répondu CosineCuber 2014-05-07 10:48:05

Vous pouvez le faire par deux méthodes

  • Il suffit de faire les propriétés" TabStop " de la zone de texte souhaitée à false maintenant, il ne se concentrera pas même si vous avez un champ de texte
  • Faites glisser deux zones de texte

    1. rendre visible sur lequel vous ne voulez pas foucus qui est textbox1
    2. rendez le 2ème invisible et accédez aux propriétés de ce champ de texte et sélectionnez

Tabindex valeur à 0 de textbox2

  1. et sélectionnez le tabindex de votre textbox1 à 1 maintenant, il ne se concentrera pas sur textbox1
1
répondu Adiii 2015-01-31 06:36:44

Si tout ce que vous voulez 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
répondu Roland 2015-08-06 10:16:54

Essayez de définir TabStop sur False pour votre contrôle de vue qui n'est pas focalisé.

Pour par exemple:

txtEmpID.TabStop = false;
0
répondu Shaheer 2017-01-31 14:02:22

Dans le constructeur du formulaire ou UserControl contenant la zone de texte, écrivez

SetStyle(ControlStyles.Selectable, false);

Après L'InitializeComponent(); Source: https://stackoverflow.com/a/4811938/5750078

Exemple:

public partial class Main : UserControl
{

    public Main()
    {
        InitializeComponent();
        SetStyle(ControlStyles.Selectable, false);
    }
-1
répondu Loaderon 2018-01-25 15:53:43