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?

Callum Rogers
la source

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.

Henk Holterman
la source
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;       
}
Pourquoi si sérieux
la source
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
FLeDieu
la source
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.

Spencer Ruport
la source
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;
marcigo36
la source
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.

Vélociraptors
la source
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.

charith rasanga
la source
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.

Kristopher Ives
la source
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;
}
kaspi
la source
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é.

Tommix
la source
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: /

Bhawk1990
la source
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);
    }
}
VladL
la source
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();
                });
            }
        }
    }
Torus
la source
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!

CosineCuber
la source
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
Adiii
la source
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.

Roland
la source
0

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

Par exemple:

txtEmpID.TabStop = false;
Shaheer
la source
-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);
    }
Loaderon
la source