Lorsqu'une zone de texte C # WinForms reçoit le focus, je veux qu'elle se comporte comme la barre d'adresse de votre navigateur.
Pour voir ce que je veux dire, cliquez sur dans la barre d'adresse de votre navigateur Web. Vous remarquerez le comportement suivant:
- Cliquer dans la zone de texte devrait sélectionner tout le texte si la zone de texte n'était pas focalisée auparavant.
- Faites glisser la souris vers le bas et faites glisser dans la zone de texte pour sélectionner uniquement le texte que j'ai mis en évidence avec la souris.
- Si la zone de texte est déjà focalisée, cliquer ne sélectionne pas tout le texte.
- La mise au point de la zone de texte par programme ou via la tabulation du clavier doit sélectionner tout le texte.
Je veux faire exactement cela dans WinForms.
ALERTE FASTEST GUN: veuillez lire ce qui suit avant de répondre! Merci les gars. :-)
L'appel de .SelectAll () pendant les événements .Enter ou .GotFocus ne fonctionnera pas car si l'utilisateur a cliqué sur la zone de texte, le curseur sera placé là où il a cliqué, désélectionnant ainsi tout le texte.
L'appel de .SelectAll () pendant l'événement .Click ne fonctionnera pas car l'utilisateur ne pourra pas sélectionner de texte avec la souris; l'appel .SelectAll () continuera d'écraser la sélection de texte de l'utilisateur.
L'appel de BeginInvoke ((Action) textbox.SelectAll) sur focus / enter event enter ne fonctionne pas car il enfreint la règle n ° 2 ci-dessus, il continuera à remplacer la sélection de l'utilisateur sur le focus.
la source
Réponses:
Tout d'abord, merci pour les réponses! 9 réponses au total. Je vous remercie.
Mauvaise nouvelle: toutes les réponses avaient des bizarreries ou ne fonctionnaient pas tout à fait correctement (ou pas du tout). J'ai ajouté un commentaire à chacun de vos messages.
Bonne nouvelle: j'ai trouvé un moyen de le faire fonctionner. Cette solution est assez simple et semble fonctionner dans tous les scénarios (souris vers le bas, sélection de texte, mise au point par tabulation, etc.)
Pour autant que je sache, cela fait qu'une zone de texte se comporte exactement comme la barre d'adresse d'un navigateur Web.
J'espère que cela aidera le prochain gars qui essaiera de résoudre ce problème d'une simplicité trompeuse.
Merci encore, les gars, pour toutes vos réponses qui m'ont aidé à me diriger vers le bon chemin.
la source
alreadyFocused = true;
MouseUp hors de l'instruction if. Parce que si vous sélectionnez immédiatement des parties du texte, le prochain clic sélectionnera à nouveau tout le texte.J'ai trouvé une solution plus simple à cela. Cela implique de lancer SelectAll de manière asynchrone
Control.BeginInvoke
afin qu'il se produise après les événements Enter et Click:En C #:
Dans VB.NET (merci à Krishanu Dey )
la source
Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) End Sub
Mouse down and drag in the textbox should select only the text I've highlighted with the mouse.
ne fonctionne pas comme souhaité. Mais toujours la solution la plus courte et la plus élégante :)Votre solution est bonne, mais échoue dans un cas précis. Si vous donnez le focus à TextBox en sélectionnant une plage de texte au lieu de simplement cliquer, l'indicateur alreadyFocussed n'est pas défini sur true, donc lorsque vous cliquez une deuxième fois dans la zone de texte, tout le texte est sélectionné.
Voici ma version de la solution. J'ai également mis le code dans une classe qui hérite de TextBox, donc la logique est bien cachée.
la source
C'est un peu kludgey, mais dans votre événement de clic, utilisez
SendKeys.Send( "{HOME}+{END}" );
.la source
Cliquez sur l'événement de la zone de texte? Ou même l'événement MouseCaptureChanged fonctionne pour moi. - D'ACCORD. ne fonctionne pas.
Vous devez donc faire 2 choses:
Fonctionne également pour la tabulation (via textBoxes vers celui-ci) - appelez SelectAll () dans Enter juste au cas où ...
la source
Une réponse en une ligne que j'utilise ... vous pourriez vous donner un coup de pied ...
Dans l'événement Enter:
txtFilter.BeginInvoke (nouveau MethodInvoker (txtFilter.SelectAll));
la source
Ok, après l'avoir essayé, voici ce que vous voulez:
Cela a sélectionné tout le texte sur l'entrée, mais m'a permis de mettre en évidence une partie du texte par la suite, ou vous permet de mettre en évidence au premier clic.
Sur demande:
Pour moi, la tabulation dans le contrôle sélectionne tout le texte.
la source
Voici une fonction d'assistance qui amène la solution au niveau suivant - réutilisation sans héritage.
Pour l'utiliser, appelez simplement la fonction en passant une zone de texte et elle s'occupe de tous les bits désordonnés pour vous. Je suggère de câbler toutes vos zones de texte dans l'événement Form_Load. Vous pouvez placer cette fonction dans votre formulaire, ou si vous êtes comme moi, quelque part dans une classe utilitaire pour encore plus de réutilisation.
la source
Cela a fonctionné pour une TextBox WPF / XAML.
la source
Ceci est similaire à la réponse populaire de nzhenry , mais je trouve qu'il est plus facile de ne pas avoir à sous-classer:
la source
SelectAll n'a jamais fonctionné pour moi.
Cela marche.
la source
J'ai trouvé une solution encore plus simple:
Pour vous assurer que tout le texte est sélectionné lorsque vous cliquez sur une zone de texte, assurez-vous que le gestionnaire Click appelle le gestionnaire Enter. Pas besoin de variables supplémentaires!
Exemple:
la source
la source
Fait intéressant, un ComboBox avec DropDownStyle = Simple a à peu près exactement le comportement que vous recherchez, je pense.
(Si vous réduisez la hauteur du contrôle pour ne pas afficher la liste - puis de quelques pixels de plus - il n'y a pas de différence effective entre le ComboBox et le TextBox.)
la source
Pourquoi n'utilisez-vous pas simplement l'événement MouseDown de la zone de texte? Cela fonctionne bien pour moi et n'a pas besoin d'un booléen supplémentaire. Très propre et simple, par exemple:
la source
J'ai appelé SelectAll à l'intérieur de l'événement MouseUp et cela a bien fonctionné pour moi.
la source
Dérivez simplement une classe de TextBox ou MaskedTextBox:
Et utilisez-le sur vos formulaires.
la source
Avez-vous essayé la solution proposée sur le forum MSDN "Windows Forms General" qui sous-classe simplement TextBox?
la source
En fait, GotFocus est le bon événement (message vraiment) qui vous intéresse, car peu importe comment vous obtenez le contrôle, vous l'obtiendrez même éventuellement. La question est de savoir quand appelez-vous SelectAll ().
Essaye ça:
la source
Pour un groupe de zones de texte dans un formulaire:
la source
Je sais que cela a déjà été résolu, mais j'ai une suggestion qui, à mon avis, est en fait plutôt simple.
Dans l'événement de la souris, tout ce que vous avez à faire est de placer
Cela semble fonctionner pour moi dans VB.NET (je sais que c'est une question C # ... malheureusement, je suis obligé d'utiliser VB à mon travail .. et j'avais ce problème, c'est ce qui m'a amené ici ... )
Je n'ai pas encore trouvé de problème avec ça ... sauf le fait qu'il ne sélectionne pas immédiatement au clic, mais j'avais des problèmes avec ça ....
la source
La solution suivante fonctionne pour moi. J'ai ajouté
OnKeyDown
etOnKeyUp
override d'événements pour conserver le texte TextBox toujours sélectionné.la source
Définissez la sélection lorsque vous quittez le contrôle. Il sera là à votre retour. Tabulation autour du formulaire et lorsque vous revenez au contrôle, tout le texte sera sélectionné.
Si vous entrez avec la souris, le curseur sera correctement placé à l'endroit où vous avez cliqué.
la source
Solution très simple:
EDIT: Original OP était en particulier préoccupé par la séquence souris vers le bas / sélection de texte / souris vers le haut, auquel cas la solution simple ci-dessus aboutirait à une sélection partielle du texte.
Cela devrait résoudre * le problème (en pratique j'intercepte WM_SETCURSOR):
* En fait, la séquence suivante se termine par une sélection de texte partielle, mais si vous déplacez la souris sur la zone de texte, tout le texte sera à nouveau sélectionné:
mouse-down / text-selection / mouse-move-out-textbox / mouse-up
la source
Je trouve que cela fonctionne mieux, lorsque la souris clique et ne relâche pas immédiatement:
la source
Ma solution est assez primitive mais fonctionne bien pour mon objectif
la source
Le ci-dessous semble fonctionner. L'événement enter gère la tabulation vers le contrôle et MouseDown fonctionne lorsque l'utilisateur clique sur le contrôle.
la source
La réponse peut être en fait bien plus simple que TOUT ce qui précède, par exemple (dans WPF):
bien sûr, je ne peux pas savoir comment vous voulez utiliser ce code, mais la partie principale à regarder ici est: Appelez d'abord .Focus () puis appelez .SelectAll ();
la source
utilisez simplement selectall () lors de l'entrée et cliquez sur les événements
la source
J'ai créé un nouveau projet VB.Net Wpf. J'ai créé une TextBox et utilisé ce qui suit pour le codebehind:
la source