Ketika kotak teks C # WinForms menerima fokus, saya ingin itu berperilaku seperti bilah alamat browser Anda.
Untuk melihat apa yang saya maksud, klik di bilah alamat browser web Anda. Anda akan melihat perilaku berikut:
- Mengklik di kotak teks harus memilih semua teks jika kotak teks sebelumnya tidak fokus.
- Mouse ke bawah dan seret di kotak teks harus memilih hanya teks yang saya soroti dengan mouse.
- Jika kotak teks sudah fokus, mengklik tidak memilih semua teks.
- Memfokuskan kotak teks secara terprogram atau melalui tab keyboard harus memilih semua teks.
Saya ingin melakukan ini di WinForms.
ALARM GUN TERCEPAT: silakan baca yang berikut sebelum menjawab! Terima kasih kawan :-)
Memanggil .SelectAll () selama acara .Enter atau .GotFocus tidak akan berfungsi karena jika pengguna mengklik kotak teks, tanda sisipan akan ditempatkan di tempat dia mengklik, sehingga membatalkan pilihan semua teks.
Memanggil .SelectAll () selama acara .Click tidak akan berfungsi karena pengguna tidak akan dapat memilih teks apa pun dengan mouse; panggilan .SelectAll () akan terus menimpa pemilihan teks pengguna.
Memanggil BeginInvoke ((Tindakan) textbox.Pilih Semua) pada fokus / masukkan acara tidak berfungsi karena melanggar aturan # 2 di atas, itu akan terus mengabaikan pemilihan pengguna pada fokus.
sumber
Jawaban:
Pertama-tama, terima kasih atas jawabannya! 9 jawaban total. Terima kasih.
Berita buruk: semua jawaban memiliki keanehan atau tidak berfungsi dengan benar (atau sama sekali). Saya telah menambahkan komentar ke setiap posting Anda.
Berita bagus: Saya sudah menemukan cara untuk membuatnya bekerja. Solusi ini sangat mudah dan tampaknya bekerja di semua skenario (mousing down, memilih teks, fokus tab, dll.)
Sejauh yang saya tahu, ini menyebabkan kotak teks berperilaku persis seperti bilah alamat browser web.
Semoga ini bisa membantu lelaki berikutnya yang mencoba menyelesaikan masalah sederhana ini.
Terima kasih sekali lagi, semuanya, atas semua jawaban Anda yang membantu mengarahkan saya ke jalan yang benar.
sumber
alreadyFocused = true;
MouseUp keluar dari pernyataan-if. Karena jika Anda segera memilih bagian teks, klik berikutnya akan memilih seluruh teks lagi.Saya menemukan solusi yang lebih sederhana untuk ini. Ini melibatkan menendang SelectAll menggunakan secara tidak sinkron
Control.BeginInvoke
sehingga terjadi setelah peristiwa Enter dan Click terjadi:Dalam C #:
Di VB.NET (terima kasih kepada Krishanu Dey )
sumber
Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) End Sub
Mouse down and drag in the textbox should select only the text I've highlighted with the mouse.
tidak berfungsi seperti yang diinginkan. Tapi tetap solusi terpendek dan paling elegan :)Solusi Anda baik, tetapi gagal dalam satu kasus tertentu. Jika Anda memberikan fokus TextBox dengan memilih rentang teks alih-alih hanya mengklik, flag yang sudah difokuskan tidak disetel ke true, jadi ketika Anda mengklik di TextBox untuk kedua kalinya, semua teks akan dipilih.
Ini adalah versi solusinya. Saya juga memasukkan kode ke dalam kelas yang mewarisi TextBox, jadi logikanya tersembunyi dengan baik.
sumber
Agak kludgey, tetapi dalam acara klik Anda, gunakan
SendKeys.Send( "{HOME}+{END}" );
.sumber
Klik acara kotak teks? Atau bahkan acara MouseCaptureChanged bekerja untuk saya. - BAIK. tidak bekerja
Jadi, Anda harus melakukan 2 hal:
Berfungsi untuk menabrak (melalui kotak teks ke kotak) juga - panggil SelectAll () di Enter untuk berjaga-jaga ...
sumber
Jawaban satu baris yang saya gunakan ... Anda mungkin menendang diri sendiri ...
Di Enter Event:
txtFilter.BeginInvoke (MethodInvoker baru (txtFilter.SelectAll));
sumber
Ok, setelah mencobanya di sini adalah yang Anda inginkan:
Ini memilih semua teks pada entri, tetapi memungkinkan saya untuk menyorot bagian dari teks setelahnya, atau memungkinkan Anda untuk menyorot pada klik pertama.
Atas permintaan:
Bagi saya, tab ke kontrol memilih semua teks.
sumber
Inilah fungsi pembantu yang membawa solusi ke tingkat selanjutnya - digunakan kembali tanpa warisan.
Untuk menggunakan ini cukup panggil fungsi lewat TextBox dan itu mengurus semua bit berantakan untuk Anda. Saya sarankan memasang semua kotak teks Anda di acara Form_Load. Anda dapat menempatkan fungsi ini di formulir Anda, atau jika Anda seperti saya, di suatu tempat di kelas utilitas untuk penggunaan kembali yang lebih banyak lagi.
sumber
Ini bekerja untuk WPF / XAML TextBox.
sumber
Ini mirip dengan jawaban populer nzhenry , tetapi saya merasa lebih mudah untuk tidak perlu subkelas:
sumber
SelectAll tidak pernah bekerja untuk saya.
Ini bekerja.
sumber
Saya telah menemukan solusi yang lebih sederhana:
Untuk memastikan semua teks dipilih saat mengklik pada kotak teks, pastikan bahwa pengendali Klik memanggil pengendali masuk. Tidak perlu variabel tambahan!
Contoh:
sumber
sumber
Menariknya, ComboBox dengan DropDownStyle = Sederhana memiliki perilaku yang persis sama persis seperti yang Anda cari, saya pikir.
(Jika Anda mengurangi ketinggian kontrol untuk tidak menampilkan daftar - dan kemudian beberapa piksel lebih banyak - tidak ada perbedaan efektif antara ComboBox dan TextBox.)
sumber
Mengapa Anda tidak menggunakan MouseDown-Event dari kotak teks? Ini berfungsi dengan baik untuk saya dan tidak perlu boolean tambahan. Sangat bersih dan sederhana, mis .:
sumber
Saya menelepon SelectAll inside MouseUp event dan bekerja dengan baik untuk saya.
sumber
Turunkan kelas dari TextBox atau MaskedTextBox:
Dan gunakan pada formulir Anda.
sumber
Sudahkah Anda mencoba solusi yang disarankan di Forum MSDN "Windows Forms General" yang hanya subkelas TextBox?
sumber
Sebenarnya GotFocus adalah acara yang tepat (pesan benar-benar) yang Anda minati, karena tidak peduli bagaimana Anda sampai ke kontrol Anda akan mendapatkan ini bahkan pada akhirnya. Pertanyaannya adalah kapan Anda memanggil SelectAll ().
Coba ini:
sumber
Untuk sekelompok kotak teks dalam formulir:
sumber
Saya tahu ini sudah diselesaikan tetapi saya punya saran yang menurut saya sebenarnya agak sederhana.
Dalam acara mouse yang harus Anda lakukan adalah menempatkan
Tampaknya bekerja untuk saya di VB.NET (saya tahu ini adalah pertanyaan C # ... sayangnya saya terpaksa menggunakan VB di pekerjaan saya .. dan saya mengalami masalah ini, yang membawa saya ke sini ... )
Saya belum menemukan masalah dengan itu .. kecuali kenyataan bahwa itu tidak langsung memilih klik, tapi saya mengalami masalah dengan itu ....
sumber
Solusi berikut ini berfungsi untuk saya. Saya menambahkan
OnKeyDown
danOnKeyUp
menimpa acara untuk menjaga teks TextBox selalu dipilih.sumber
Setel pilihan ketika Anda meninggalkan kontrol. Itu akan ada di sana ketika Anda kembali. Tab di sekitar formulir dan ketika Anda kembali ke kontrol, semua teks akan dipilih.
Jika Anda masuk dengan mouse, maka tanda sisipan akan ditempatkan pada titik di mana Anda mengklik.
sumber
Solusi yang sangat sederhana:
EDIT: OP asli khususnya prihatin tentang urutan mouse-down / pemilihan teks / mouse-up, dalam hal ini solusi sederhana di atas akan berakhir dengan teks yang dipilih sebagian.
Ini harus menyelesaikan * masalahnya (dalam praktiknya saya mencegat WM_SETCURSOR):
* Sebenarnya urutan berikut berakhir dengan pemilihan teks parsial tetapi kemudian jika Anda memindahkan mouse ke kotak teks semua teks akan dipilih lagi:
mouse-down / pemilihan teks / mouse-pindah-textbox / mouse-up
sumber
Saya menemukan ini bekerja paling baik, ketika klik mouse dan tidak segera dirilis:
sumber
Solusi saya cukup primitif tetapi berfungsi dengan baik untuk tujuan saya
sumber
Di bawah ini sepertinya berfungsi. Acara masuk menangani tab ke kontrol dan MouseDown berfungsi saat kontrol diklik.
sumber
Jawabannya sebenarnya bisa lebih sederhana daripada SEMUA yang di atas, misalnya (dalam WPF):
tentu saja saya tidak tahu bagaimana Anda ingin menggunakan kode ini, tetapi bagian utama untuk dilihat di sini adalah: Panggilan pertama .Fokus () dan kemudian panggil. Pilih Semua ();
sumber
cukup gunakan selectall () pada enter dan klik acara
sumber
Saya membuat proyek VB.Net Wpf baru. Saya membuat satu TextBox dan menggunakan yang berikut ini untuk codebehind:
sumber