У меня есть текстовое поле со свойством .Multiline, установленным в true. Я регулярно добавляю в него новые строки текста. Я хотел бы, чтобы текстовое поле автоматически прокручивалось до самой нижней записи (самой новой) при добавлении новой строки. Как мне это сделать?
295
Ответы:
Если вы используете
TextBox.AppendText(string text)
, он будет автоматически прокручиваться до конца вновь добавленного текста. Он избегает мерцающей полосы прокрутки, если вы вызываете ее в цикле.Это также происходит на порядок быстрее, чем конкатенация на
.Text
свойство. Хотя это может зависеть от того, как часто вы это называете; Я тестировал с жесткой петлей.Он не будет прокручиваться, если он вызывается до отображения текстового поля или если текстовое поле в противном случае не отображается (например, на другой вкладке TabPanel). См. TextBox.AppendText () не автопрокрутка . Это может или не может быть важным, в зависимости от того, требуется ли автоматическая прокрутка, когда пользователь не видит текстовое поле.
Кажется, что альтернативный метод из других ответов также не работает в этом случае. Одним из способов решения этой проблемы является дополнительная прокрутка
VisibleChanged
события:Внутренне
AppendText
делает что-то вроде этого:Но не должно быть никаких причин делать это вручную.
(Если вы декомпилируете его самостоятельно, вы увидите, что он использует некоторые, возможно, более эффективные внутренние методы и имеет то, что кажется незначительным частным случаем.)
источник
tb.Text += ....
WndProc и маршалами Теперь я чувствую себя глупо: DВы можете использовать следующий фрагмент кода:
который будет автоматически прокручиваться до конца.
источник
Кажется, интерфейс изменился в .NET 4.0. Существует следующий метод, который достигает всего вышеперечисленного. Как предложил Томми Энгебретсен, помещение его в обработчик событий TextChanged делает его автоматическим.
источник
TextBoxBase
классе вSystem.Windows.Controls.Primitives
пространстве имен (PresentationFramework
сборка, WPF). Этот метод не существует и не будет работать в WinForms, чейTextBox
класс наследуется отTextBoxBase
вSystem.Windows.Forms
пространстве имен (System.Windows.Forms
сборка, WinForms).ScrollToEnd()
может быть очень плохое исполнение. В моем приложении это составляло более 50% времени профилирования.Попробуйте добавить предложенный код в событие TextChanged:
источник
не работал для меня (Windows 8.1, независимо от причины).
И так как я все еще на .NET 2.0, я не могу использовать ScrollToEnd.
Но это работает:
VB.NET:
источник
Мне нужно было добавить обновление:
источник
Я обнаружил простую разницу, которая не была рассмотрена в этой теме.
Если вы делаете все
ScrollToCarat()
звонки как частьLoad()
события вашей формы , это не сработает. Я только добавил свойScrollToCarat()
звонок вActivated()
событие моей формы , и он работает нормально.редактировать
Важно выполнять эту прокрутку только при первом запуске
Activated
события формы (не при последующих активациях), или она будет прокручивать каждую активации вашей формы, чего вы, вероятно, не хотите.Так что, если вы перехватываете
Activated()
событие только для прокрутки текста при загрузке программы, вы можете просто отписаться от события в самом обработчике события, таким образом:Если у вас есть другие вещи, которые вам нужно делать при каждой активации формы, вы можете установить
bool
значение true в первый раз, когда вашActivated()
событие запускается, поэтому вы не прокручиваете последующие активации, но все же можете делать другие вещи, которые вам нужны делать.Кроме того , если ваш
TextBox
находится на вкладке , что неSelectedTab
,ScrollToCarat()
не будет иметь никакого эффекта. Так что вам нужно, по крайней мере, сделать его выбранной вкладкой во время прокрутки. Вы можете заключить код в пары « а»YourTab.SuspendLayout();
и «YourTab.ResumeLayout(false);
пара», если ваша форма мерцает при этом.Конец редактирования
Надеюсь это поможет!
источник
Это будет прокручивать до конца текстового поля при изменении текста, но все же позволяет пользователю прокручивать вверх
протестировано на Visual Studio Enterprise 2017
источник
Для тех, кто находится здесь, ожидающих увидеть реализацию веб-форм, вы хотите использовать обработчик событий endRequest менеджера запросов страниц ( https://stackoverflow.com/a/1388170/1830512 ). Вот что я сделал для своего TextBox на странице содержимого с мастер-страницы, пожалуйста, игнорируйте тот факт, что я не использовал переменную для элемента управления:
источник
Это работало только для меня ...
txtSerialLogging-> Text = "";
txtSerialLogging-> AppendText (ы);
Я перепробовал все вышеописанные случаи, но проблема в том, что в моем случае текст может уменьшаться, увеличиваться и также может оставаться статичным в течение длительного времени. статические средства, статическая длина (строки), но содержание другое.
Итак, я столкнулся с ситуацией скачка одной строки в конце, когда длина (строки) остается неизменной в течение нескольких раз ...
источник
Я использую функцию для этого:
источник