Pourquoi le texte dans la zone de texte surligné (sélectionné) lorsque le formulaire est affiché?
J'ai un formulaire contenant un TextBox
en C# qui-je définir une chaîne de caractères comme suit:
textBox.Text = str;
Lorsque le formulaire est affiché, pourquoi le texte dans la texbox apparaissent en surbrillance/sélectionné?
- Votre question pourrait être lié à une stackoverflow.com/questions/1140250/...
- Avez-vous réussi à régler cette question? Comment avez-vous résoudre ce problème?
- Je n'ai pas trouvé le temps de le regarder encore. Je vais le prix de la réponse dans quelques jours.
- Vous pouvez ajouter un vb.net balise, car le vrai problème est le même et accepté réponse est valable aussi
- BenSmith de la réponse relative à l'affichage de l'Onglet Commande seront très utiles dans ce genre de ce scénario.
Vous devez vous connecter pour publier un commentaire.
La zone de texte a un
TabIndex
de 0 etTabStop
définie sur true. Cela signifie que le contrôle sera donné le focus lorsque le formulaire est affiché.Vous pouvez donner un autre contrôle de l'0
TabIndex
(si il y en a un) et donner de la zone de texte à un autre onglet index (>0), ou un ensembleTabStop
à faux pour la zone de texte pour arrêter cela.Le comportement par défaut d'une zone de texte dans les Windows Forms est pour mettre en surbrillance le texte si il est porté pour la première fois en surbrillance, mais pas si il est cliqué. Nous pouvons voir cela dans un Réflecteur en regardant le
TextBox
'sOnGotFocus()
remplacer:C'est que si l'instruction qui est à l'origine du comportement que nous n'aimons pas. En outre, pour ajouter l'insulte à l'injure, l'
Text
propriété de définition de la aveuglément réinitialise queselectionSet
variable à chaque fois que le texte est attribué à nouveau:Donc si vous avez une zone de texte et onglet en elle, tous les textes seront sélectionnés. Si vous cliquez sur, le point culminant est retiré, et si vous re-onglet dans, votre position du curseur (et de sélection de longueur zéro) est préservée. Mais si nous définir par programmation nouvelle
Text
, et un onglet dans la zone de texte nouveau, puis tout le texte sera sélectionné à nouveau.Si vous êtes comme moi et de trouver ce comportement gênant et incohérente, puis il y a deux façons de contourner ce problème.
Le premier, et probablement le plus simple, c'est simplement de déclencher le réglage de
selectionSet
en appelantDeselectAll()
sur le formulaireLoad()
et chaque fois que leText
changements:(
DeselectAll()
que des sériesSelectionLength
à zéro. C'est en faitSelectionStart
qui inverse laTextBox
'sselectionSet
variable. Dans le cas ci-dessus, l'appel àDeselectAll()
n'est pas nécessaire car nous réglage du début à la fin du texte. Mais si nous avons choisi de toute autre position, comme le début du texte, puis de l'appel, c'est une bonne idée.)Le plus de façon permanente à l'est de créer notre propre zone de texte avec le comportement souhaité par le biais de l'héritage:
Vous avez peut-être tenté de tout simplement pas appeler
base.OnGotFocus()
, mais alors nous perdrions des fonctionnalités utiles dans la baseControl
classe. Et vous pourriez être tenté de ne pas salir avec leselectionSet
non-sens, et il suffit de désélectionner le texte à chaque fois, dans OnGotFocus(), mais alors nous perdrions l'utilisateur de mettre en évidence des onglets en dehors du terrain et à l'arrière.Laid? Vous betcha. Mais elle est ce qu'elle est.
Les réponses à cette question m'a beaucoup aidé avec un problème similaire, mais la réponse la plus simple est seulement fait allusion à beaucoup d'autres complexes de suggestions. Juste mettre SelectionStart à 0 après le réglage de votre Texte. Problème résolu!
Exemple:
Vous pouvez également choisir l'ordre de tabulation pour les contrôles de votre formulaire par l'ouverture:
Vue->Onglet Commande
Notez que cette option n'est disponible que dans "Affichage" si vous avez la conception de Formulaire ouverts de vue.
En sélectionnant l'Onglet "Commande" ouvre une vue de la Forme, qui vous permet de choisir l'onglet désiré commande, en cliquant sur les commandes.
À unhighlight un champ de texte, avec VS 2013, essayez d'init avec:
Et ajoutez la méthode:
Je n'ai pas testé cela sur C#, mais j'ai rencontré le même problème à l'aide d'un C++ WIN32 boîte de dialogue. Est semble que vous pouvez changer le comportement par retour de FAUX, d'OnInitDialog() ou WM_INITDIALOG. Espérons que cette aide.