Eu tenho uma caixa de texto com a propriedade .Multiline definida como true. A intervalos regulares, estou adicionando novas linhas de texto. Desejo que a caixa de texto role automaticamente para a entrada mais abaixo (a mais nova) sempre que uma nova linha for adicionada. Como eu faço isso?
295
Respostas:
Se você usar
TextBox.AppendText(string text)
, ele rolará automaticamente até o final do texto recém-anexado. Evita a barra de rolagem oscilante se você estiver chamando em um loop.Também é uma ordem de magnitude mais rápida que a concatenação na
.Text
propriedade. Embora isso possa depender da frequência com que você está ligando; Eu estava testando com um loop apertado.Isso não rolará se for chamado antes da caixa de texto ser exibida ou se a caixa de texto não estiver visível (por exemplo, em uma guia diferente de um TabPanel). Consulte TextBox.AppendText () sem rolagem automática . Isso pode ou não ser importante, dependendo se você precisa de rolagem automática quando o usuário não pode ver a caixa de texto.
Parece que o método alternativo das outras respostas também não funciona neste caso. Uma maneira de contornar isso é executar rolagem adicional no
VisibleChanged
evento:Internamente,
AppendText
faz algo assim:Mas não deve haver razão para fazê-lo manualmente.
(Se você o descompilar, verá que ele usa métodos internos possivelmente mais eficientes e possui o que parece ser um caso especial menor.)
fonte
tb.Text += ....
e WndProc e marechais Agora eu me sinto estúpido: DVocê pode usar o seguinte trecho de código:
que rolará automaticamente até o fim.
fonte
Parece que a interface mudou no .NET 4.0. Existe o seguinte método que atinge todas as opções acima. Como sugeriu Tommy Engebretsen, colocá-lo em um manipulador de eventos TextChanged o torna automático.
fonte
TextBoxBase
classe noSystem.Windows.Controls.Primitives
espaço para nome (PresentationFramework
assembly, WPF). Este método não existe e não vai funcionar no WinForms, cujaTextBox
herda classe a partirTextBoxBase
doSystem.Windows.Forms
namespace (System.Windows.Forms
montagem, WinForms).ScrollToEnd()
desempenho pode ser extremamente ruim. No meu aplicativo, foi responsável por mais de 50% do tempo de criação de perfil.Tente adicionar o código sugerido ao evento TextChanged:
fonte
não funcionou para mim (Windows 8.1, qualquer que seja o motivo).
E como ainda estou no .NET 2.0, não posso usar o ScrollToEnd.
Mas isso funciona:
VB.NET:
fonte
Eu precisava adicionar uma atualização:
fonte
Eu encontrei uma diferença simples que não foi abordada neste tópico.
Se você estiver fazendo todas as
ScrollToCarat()
chamadas como parte doLoad()
evento do formulário , isso não funcionará. Acabei de adicionar minhaScrollToCarat()
chamada aoActivated()
evento do meu formulário e funciona bem.Editar
É importante fazer essa rolagem apenas na primeira vez que o
Activated
evento do formulário for disparado (não nas ativações subseqüentes), ou rolará a cada vez que seu formulário for ativado, o que provavelmente você não quer.Portanto, se você estiver capturando apenas o
Activated()
evento para rolar o texto quando o programa for carregado, basta cancelar a inscrição no evento dentro do próprio manipulador de eventos, assim:Se você tiver outras coisas que precisa fazer sempre que seu formulário for ativado, defina a
bool
como true na primeira vez que seu formulário for ativado .Activated()
evento for disparado, para não rolar nas ativações subsequentes, mas ainda poderá fazer as outras coisas necessárias. Faz.Além disso, se você
TextBox
estiver em uma guia que não seja aSelectedTab
,ScrollToCarat()
não terá efeito. Portanto, você precisa pelo menos torná-la a guia selecionada enquanto estiver rolando. Você pode agrupar o código em um parYourTab.SuspendLayout();
eYourTab.ResumeLayout(false);
se o seu formulário piscar quando você fizer isso.Fim da edição
Espero que isto ajude!
fonte
Isso rolará até o final da caixa de texto quando o texto for alterado, mas ainda permitirá que o usuário role para cima
testado no Visual Studio Enterprise 2017
fonte
Para qualquer outra pessoa que esteja aqui esperando ver uma implementação de formulários da web, deseja usar o manipulador de eventos endRequest do Page Request Manager ( https://stackoverflow.com/a/1388170/1830512 ). Aqui está o que eu fiz para o meu TextBox em uma página de conteúdo de uma página mestra, ignore o fato de que eu não usei uma variável para o controle:
fonte
Isso só funcionou para mim ...
txtSerialLogging-> Text = "";
txtSerialLogging-> AppendText (s);
Tentei todos os casos acima, mas o problema é que, no meu caso, os textos podem diminuir, aumentar e também podem permanecer estáticos por um longo tempo. static significa, comprimento estático (linhas), mas o conteúdo é diferente.
Então, eu estava enfrentando uma situação de salto de linha no final, quando o comprimento (linhas) permanece o mesmo por algumas vezes ...
fonte
Eu uso uma função para isso:
fonte