Saya memiliki kotak teks dengan properti .Multiline diatur ke true. Secara berkala, saya menambahkan baris teks baru ke dalamnya. Saya ingin kotak teks untuk secara otomatis gulir ke entri paling bawah (yang terbaru) setiap kali baris baru ditambahkan. Bagaimana saya mencapai ini?
295
Jawaban:
Jika Anda menggunakan
TextBox.AppendText(string text)
, itu akan secara otomatis gulir ke akhir teks yang baru ditambahkan. Ini menghindari scrollbar yang berkedip jika Anda memanggilnya dalam satu lingkaran.Ini juga merupakan urutan besarnya lebih cepat daripada menggabungkan ke
.Text
properti. Meskipun itu mungkin tergantung pada seberapa sering Anda menyebutnya; Saya sedang menguji dengan loop ketat.Ini tidak akan menggulir jika dipanggil sebelum kotak teks ditampilkan, atau jika kotak teks tidak terlihat (misalnya di tab TabPanel yang berbeda). Lihat TextBox.AppendText () tidak autoscrolling . Ini mungkin atau mungkin tidak penting, tergantung pada apakah Anda memerlukan autoscroll ketika pengguna tidak dapat melihat kotak teks.
Tampaknya metode alternatif dari jawaban lain juga tidak berfungsi dalam kasus ini. Salah satu caranya adalah dengan melakukan pengguliran tambahan pada
VisibleChanged
acara tersebut:Secara internal,
AppendText
lakukan sesuatu seperti ini:Tetapi seharusnya tidak ada alasan untuk melakukannya secara manual.
(Jika Anda mendekompilasi sendiri, Anda akan melihat bahwa ia menggunakan beberapa metode internal yang mungkin lebih efisien, dan memiliki apa yang tampaknya merupakan kasus khusus kecil.)
sumber
tb.Text += ....
dan WndProc dan marshal Sekarang aku merasa bodoh: DAnda dapat menggunakan potongan kode berikut:
yang secara otomatis akan bergulir ke ujung.
sumber
Tampaknya antarmuka telah berubah di .NET 4.0. Ada metode berikut yang mencapai semua hal di atas. Seperti yang disarankan Tommy Engebretsen, memasukkannya ke dalam event handler TextChanged membuatnya otomatis.
sumber
TextBoxBase
kelas diSystem.Windows.Controls.Primitives
namespace (PresentationFramework
assembly, WPF). Metode ini tidak ada dan tidak akan berfungsi di WinForms, yangTextBox
kelasnya mewarisi dariTextBoxBase
dalamSystem.Windows.Forms
namespace (System.Windows.Forms
assembly, WinForms).ScrollToEnd()
kinerjanya sangat buruk. Dalam aplikasi saya, itu menyumbang lebih dari 50% dari waktu pembuatan profil.Cobalah untuk menambahkan kode yang disarankan ke acara TextChanged:
sumber
tidak bekerja untuk saya (Windows 8.1, apa pun alasannya).
Dan karena saya masih menggunakan .NET 2.0, saya tidak bisa menggunakan ScrollToEnd.
Tapi ini berhasil:
VB.NET:
sumber
Saya perlu menambahkan refresh:
sumber
Saya menemukan perbedaan sederhana yang belum dibahas di utas ini.
Jika Anda melakukan semua
ScrollToCarat()
panggilan sebagai bagian dariLoad()
acara formulir Anda , itu tidak berfungsi. Saya baru saja menambahkanScrollToCarat()
panggilan saya keActivated()
acara formulir saya , dan itu berfungsi dengan baik.Edit
Penting untuk hanya melakukan pengguliran ini saat
Activated
acara formulir pertama kali diaktifkan (bukan pada aktivasi berikutnya), atau akan menggulir setiap kali formulir Anda diaktifkan, yang mungkin Anda tidak inginkan.Jadi jika Anda hanya menjebak
Activated()
acara untuk menggulir teks ketika program Anda dimuat, maka Anda bisa berhenti berlangganan acara di dalam pengendali acara itu sendiri, dengan demikian:Jika Anda memiliki hal-hal lain yang perlu Anda lakukan setiap kali formulir Anda diaktifkan, Anda dapat mengatur
bool
ke true saat pertama kaliActivated()
acara Anda dipecat, sehingga Anda tidak menggulir pada aktivasi berikutnya, tetapi masih dapat melakukan hal-hal lain yang perlu Anda lakukan. melakukan.Juga, jika Anda
TextBox
berada di tab yang bukanSelectedTab
, tidakScrollToCarat()
akan berpengaruh. Jadi, Anda setidaknya perlu menjadikannya tab yang dipilih saat Anda menggulir. Anda dapat membungkus kode dalamYourTab.SuspendLayout();
danYourTab.ResumeLayout(false);
pasangan jika formulir Anda berkedip ketika Anda melakukan ini.Akhir pengeditan
Semoga ini membantu!
sumber
Ini akan bergulir ke ujung kotak teks ketika teks diubah, tetapi masih memungkinkan pengguna untuk menggulir ke atas
diuji pada Visual Studio Enterprise 2017
sumber
Untuk siapa pun yang mendarat di sini mengharapkan untuk melihat implementasi formulir web, Anda ingin menggunakan pengendali event endRequest Page Request Manager ( https://stackoverflow.com/a/1388170/1830512 ). Inilah yang saya lakukan untuk TextBox saya di Halaman Konten dari Halaman Master, abaikan fakta bahwa saya tidak menggunakan variabel untuk kontrol:
sumber
Ini hanya bekerja untuk saya ...
txtSerialLogging-> Text = "";
txtSerialLogging-> AppendText (s);
Saya mencoba semua kasus di atas, tetapi masalahnya ada pada teks kasus saya s dapat menurun, meningkat dan juga dapat tetap statis untuk waktu yang lama. cara statis, panjang statis (garis) tetapi konten berbeda.
Jadi, saya menghadapi satu situasi melompat di akhir ketika panjang (garis) tetap sama untuk beberapa kali ...
sumber
Saya menggunakan fungsi untuk ini:
sumber