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


110

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

textBox1.Focused = false;

Sa ReadOnlyvaleur de propriété est true.

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

this.Focus();

et la fonction retourne falselorsqu'une zone de texte est sélectionnée.

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

Réponses:


113

Vous avez besoin d'un autre contrôle focalisable sur lequel déplacer le focus.

Notez que vous pouvez définir le focus sur une étiquette. Vous voudrez peut-être réfléchir à l'endroit où vous voulez que la touche [Tab] la mène ensuite.

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


Merci; J'ai juste essayé de me concentrer sur une étiquette et maintenant la zone de texte devient floue. Il semble que vous ne pouvez pas vous concentrer sur un formulaire pour une raison quelconque.
Callum Rogers

7
Les contrôles de conteneur (formulaire, panneau) transmettront le focus à leur premier contrôle enfant.
Henk Holterman

Excellente suggestion. Cela a résolu mon problème. J'utilise KeyPress contre le formulaire lui-même et j'ai plusieurs boutons, etc. Le problème est que l'application prend les entrées d'un lecteur de cartes, donc si le focus s'éloigne du formulaire lui-même, tout l'enfer se déchaîne. Le fait de me concentrer sur une étiquette après un clic sur un bouton a résolu mon problème. Merci beaucoup!
joelc

62

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

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

7
J'aimerais pouvoir vous donner des millions de flèches. J'ai essayé TOUT ce que les gens ont suggéré, c'est le seul qui a fonctionné. pour une raison quelconque, la zone de texte a TOUJOURS volé le focus de tout ...
eladyanai

3
Cela fonctionne également pour les contrôles de conteneur tels que les panneaux. Je voulais juste supprimer complètement le focus et cela a fonctionné:this.ActiveControl = panelOnMyForm;
Tim Schmelter

52

Vous pouvez ajouter le code suivant:

this.ActiveControl = null;  //this = form

7
Je pense que c'est la meilleure réponse. Un grand nombre des autres méthodes telles que "Focus" si vous lisez MSDN sont répertoriées comme méthodes de bas niveau pour les concepteurs de contrôles. Si vous voulez que tout le reste ne soit "pas sélectionné", cela semble être l'approche la plus simple puisque, eh bien, ce n'est qu'une petite ligne.
Rostov

1
Cela peut être la moitié de la raison pour laquelle Microsoft a ajouté cette propriété en premier lieu.
Panzercrisis

Cela semble être la solution la plus élégante, elle a parfaitement fonctionné dans mon cas.
NetWave

Je veux vraiment que cette réponse fonctionne parce qu'elle semble juste qu'elle devrait, mais dans mon cas, cela n'a pas fonctionné parce que même si elle a déclenché l'événement Leave, elle n'a pas déclenché les événements de validation / validation.
Rhys Jones

32

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


5
Cela fonctionne assez bien car il sélectionne automatiquement le contrôle suivant dans la liste des onglets entre-temps.
Nick

3
Je développe dans Silverlight en utilisant MVVM et je l'ai implémenté en utilisant un comportement ciblant une TextBox. Comme je n'avais pas d'autre UIElement à portée de main pour mettre le focus sur la solution Désactiver / Activer a fonctionné à merveille. Merci!
Albert Oldfield

Comment puis-je le désactiver?
miguelmpn

1
@miguelmpn textBox1.Enabled = false;désactivera votre zone de texte. et le paramétrer sur truele réactivera.
Raktim Biswas

24

Vous pouvez également définir la activecontrolpropriété forms pour nullaimer

ActiveControl = null;

7
J'espère que les gens font défiler jusqu'à ceci et n'utilisent pas seulement la solution de contournement marquée comme réponse
makoshichi

Toujours la meilleure réponse à ce jour, ici mon pote, prenez mon vote pour.
xoxel

8

Focusdé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 ActiveControlpropriété du formulaire sur un contrôle différent. Vous pouvez également utiliser Selectpour sélectionner un contrôle spécifique ou SelectNextControlpour sélectionner le contrôle suivant dans l'ordre de tabulation.


1
J'ai tout essayé ici et Select()j'ai travaillé pour moi.
Derek W

8

Essaye celui-là:

Commencez par configurer l'ordre des onglets.

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

sous forme de chargement, écrivez même cette ligne.

SendKeys.Send("{TAB}");

Cela a fonctionné pour moi.


4

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 commandes ne deviennent fous.


3

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

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

this.Parent.Focus();

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


2

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 désactiver le focus d'une zone de texte.

Donner la commande suivante 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

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

Exactement le genre de solution que je recherchais. Merci!
LeftyCoder

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

0

La façon dont je me débrouille est de placer tous mes contrôles winform. Je crée toutes les étiquettes et les contrôles winform non sélectionnés comme ordre de tabulation 0, puis mon premier contrôle comme ordre de tabulation 2, puis 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, le premier TextBox n'a pas le focus!


0

vous pouvez le faire par deux méthodes

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

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

tabindex valeur à 0 de textbox2

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

0

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, ne sélectionnez simplement 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

Veuillez essayer de définir TabStopsur Falsepour votre contrôle d'affichage qui n'est pas focalisé.

Par exemple:

txtEmpID.TabStop = false;

-1

Dans le constructeur du Form ou UserControl contenant le TextBox write

SetStyle(ControlStyles.Selectable, false);

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

Exemple:

public partial class Main : UserControl
{

    public Main()
    {
        InitializeComponent();
        SetStyle(ControlStyles.Selectable, false);
    }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.