J'ai une zone de texte avec la propriété .Multiline définie sur true. À intervalles réguliers, j'y ajoute de nouvelles lignes de texte. J'aimerais que la zone de texte défile automatiquement jusqu'à l'entrée la plus basse (la plus récente) chaque fois qu'une nouvelle ligne est ajoutée. Comment est-ce que j'accomplis ceci?
295
Réponses:
Si vous utilisez
TextBox.AppendText(string text)
, il défilera automatiquement jusqu'à la fin du texte nouvellement ajouté. Cela évite la barre de défilement vacillante si vous l'appelez en boucle.Il se trouve également que c'est un ordre de grandeur plus rapide que la concaténation sur la
.Text
propriété. Bien que cela puisse dépendre de la fréquence à laquelle vous l'appelez; Je testais avec une boucle serrée.Cela ne défilera pas s'il est appelé avant que la zone de texte ne soit affichée, ou si la zone de texte n'est pas visible autrement (par exemple dans un onglet différent d'un TabPanel). Voir TextBox.AppendText () pas de défilement automatique . Cela peut être important ou non, selon que vous avez besoin du défilement automatique lorsque l'utilisateur ne peut pas voir la zone de texte.
Il semble que la méthode alternative des autres réponses ne fonctionne pas non plus dans ce cas. Une façon de le contourner consiste à effectuer un défilement supplémentaire sur l'
VisibleChanged
événement:En interne,
AppendText
fait quelque chose comme ceci:Mais il ne devrait y avoir aucune raison de le faire manuellement.
(Si vous le décompilez vous-même, vous verrez qu'il utilise des méthodes internes éventuellement plus efficaces et a ce qui semble être un cas spécial mineur.)
la source
tb.Text += ....
Je me mangeais en essayant de le faire avec WndProc et les maréchaux Maintenant, je me sens stupide: DVous pouvez utiliser l'extrait de code suivant:
qui défilera automatiquement jusqu'à la fin.
la source
Il semble que l'interface ait changé dans .NET 4.0. Il existe la méthode suivante qui réalise tout ce qui précède. Comme l'a suggéré Tommy Engebretsen, le placer dans un gestionnaire d'événements TextChanged le rend automatique.
la source
TextBoxBase
classe de l'System.Windows.Controls.Primitives
espace de noms (PresentationFramework
assembly, WPF). Cette méthode n'existe pas et ne fonctionnera pas dans WinForms, dont laTextBox
classe hérite deTextBoxBase
l'System.Windows.Forms
espace de noms (System.Windows.Forms
assembly, WinForms).ScrollToEnd()
peut être extrêmement médiocre. Dans mon application, cela représentait plus de 50% du temps de profilage.Essayez d'ajouter le code suggéré à l'événement TextChanged:
la source
n'a pas fonctionné pour moi (Windows 8.1, quelle qu'en soit la raison).
Et comme je suis toujours sur .NET 2.0, je ne peux pas utiliser ScrollToEnd.
Mais cela fonctionne:
VB.NET:
la source
J'avais besoin d'ajouter un rafraîchissement:
la source
J'ai trouvé une différence simple qui n'a pas été abordée dans ce fil.
Si vous effectuez tous les
ScrollToCarat()
appels dans le cadre de l'Load()
événement de votre formulaire , cela ne fonctionne pas. Je viens d'ajouter monScrollToCarat()
appel à l'Activated()
événement de mon formulaire , et cela fonctionne bien.Éditer
Il est important de faire ce défilement uniquement lorsque l'
Activated
événement du premier formulaire est déclenché (pas lors des activations suivantes), ou il défilera chaque fois que votre formulaire sera activé, ce que vous ne voulez probablement pas.Donc, si vous ne faites que piéger l'
Activated()
événement pour faire défiler votre texte lors du chargement de votre programme, vous pouvez simplement vous désabonner de l'événement dans le gestionnaire d'événements lui-même, donc:Si vous avez d'autres choses à faire chaque fois que votre formulaire est activé, vous pouvez définir a
bool
sur true la première fois que votreActivated()
événement est déclenché, de sorte que vous ne faites pas défiler les activations suivantes, mais vous pouvez toujours faire les autres choses dont vous avez besoin pour faire.De plus, si votre
TextBox
est sur un onglet qui n'est pas leSelectedTab
,ScrollToCarat()
n'aura aucun effet. Vous devez donc au moins en faire l'onglet sélectionné lorsque vous faites défiler. Vous pouvez encapsuler le code dans une paireYourTab.SuspendLayout();
etYourTab.ResumeLayout(false);
si votre formulaire scintille lorsque vous effectuez cette opération.Fin du montage
J'espère que cela t'aides!
la source
Cela défile jusqu'à la fin de la zone de texte lorsque le texte est modifié, mais permet toujours à l'utilisateur de faire défiler vers le haut
testé sur Visual Studio Enterprise 2017
la source
Pour quiconque atterrissant ici et s'attendant à voir une implémentation de formulaires Web, vous souhaitez utiliser le gestionnaire d'événements endRequest du Page Request Manager ( https://stackoverflow.com/a/1388170/1830512 ). Voici ce que j'ai fait pour mon TextBox dans une page de contenu à partir d'une page maître, veuillez ignorer le fait que je n'ai pas utilisé de variable pour le contrôle:
la source
Cela n'a fonctionné que pour moi ...
txtSerialLogging-> Text = "";
txtSerialLogging-> AppendText (s);
J'ai essayé tous les cas ci-dessus, mais le problème est que, dans mon cas, le texte peut diminuer, augmenter et peut également rester statique pendant longtemps. statique signifie, longueur statique (lignes) mais le contenu est différent.
Donc, je faisais face à une situation de saut de ligne à la fin lorsque la longueur (lignes) reste la même pendant quelques temps ...
la source
J'utilise une fonction pour cela:
la source