Membuat WinForms TextBox berperilaku seperti bilah alamat browser Anda

154

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:

  1. Mengklik di kotak teks harus memilih semua teks jika kotak teks sebelumnya tidak fokus.
  2. Mouse ke bawah dan seret di kotak teks harus memilih hanya teks yang saya soroti dengan mouse.
  3. Jika kotak teks sudah fokus, mengklik tidak memilih semua teks.
  4. 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.

Yehuda Gabriel Himango
sumber
3
Harap jelaskan ini untuk "RichTextBox."
Nescio
Nescio, kotak teks atau kotak teks kaya akan dilakukan. Saya mencoba solusi Anda di kotak teks juga.
Yehuda Gabriel Himango
Ini adalah kebocoran abstraksi. Cara terbaik untuk melakukannya adalah menandai WM_MOUSEACTIVATE dan SelectAll di WM_SETFOCUS jika bukan WM_MOUSEACTIVATE.
wqw
Versi WPF: stackoverflow.com/questions/4161531/…
Jonathan Allen

Jawaban:

109

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.)

bool alreadyFocused;

...

textBox1.GotFocus += textBox1_GotFocus;
textBox1.MouseUp += textBox1_MouseUp;
textBox1.Leave += textBox1_Leave;

...

void textBox1_Leave(object sender, EventArgs e)
{
    alreadyFocused = false;
}


void textBox1_GotFocus(object sender, EventArgs e)
{
    // Select all text only if the mouse isn't down.
    // This makes tabbing to the textbox give focus.
    if (MouseButtons == MouseButtons.None)
    {
        this.textBox1.SelectAll();
        alreadyFocused = true;
    }
}

void textBox1_MouseUp(object sender, MouseEventArgs e)
{
    // Web browsers like Google Chrome select the text on mouse up.
    // They only do it if the textbox isn't already focused,
    // and if the user hasn't selected all text.
    if (!alreadyFocused && this.textBox1.SelectionLength == 0)
    {
        alreadyFocused = true;
        this.textBox1.SelectAll();
    }
}

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.

Yehuda Gabriel Himango
sumber
Bagaimana ketika fokus secara pemrograman diatur ke TextBox? Saya punya masalah seperti yang dibahas di sini: stackoverflow.com/questions/24790704/... Saya bisa menyelesaikannya, setelah mode, tapi saya masih gugup tentang itu, karena "perbaikan" saya tampaknya agak muram.
B. Clay Shannon
Anda menulis, "Memanggil .Pilih Semua () selama acara. Masukkan atau .Fokus tidak akan berfungsi karena jika pengguna mengklik kotak teks, tanda sisipan akan ditempatkan di tempat yang dikliknya, sehingga tidak memilih semua teks." Saya memiliki SelectAll di acara GotFocus yang, sebagian besar, berfungsi. Bahkan, saya akan berpikir kursor ditempatkan di tempat yang diklik pengguna adalah "hal yang baik." Saya hanya ingin itu selalu dipilih ketika fokus diatur ke TextBox secara terprogram.
B. Clay Shannon
Dan saya di sini lagi! :)
dotNET
3
Anda harus memindahkan alreadyFocused = true;MouseUp keluar dari pernyataan-if. Karena jika Anda segera memilih bagian teks, klik berikutnya akan memilih seluruh teks lagi.
Robert S.
Ada satu jawaban liner di bawah ini --- BeginInvoke ((Action) MyTextBox.SelectAll); --- Layak untuk dilihat. Tampaknya melakukan semua yang diperlukan
Jenderal Gray
78

Saya menemukan solusi yang lebih sederhana untuk ini. Ini melibatkan menendang SelectAll menggunakan secara tidak sinkronControl.BeginInvoke sehingga terjadi setelah peristiwa Enter dan Click terjadi:

Dalam C #:

private void MyTextBox_Enter(object sender, EventArgs e)
{
    // Kick off SelectAll asyncronously so that it occurs after Click
    BeginInvoke((Action)delegate
    {
        MyTextBox.SelectAll();
    });
}

Di VB.NET (terima kasih kepada Krishanu Dey )

Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter 
    BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) 
End Sub
Duncan Smart
sumber
5
Jawaban Tercerdas yang pernah saya temukan .. Terima kasih banyak .. Untuk VB.net Ini Solusinya .. Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) End Sub
Krishanu Dey
Class Much 'Solusi terbaik, seperti bilah URL browser web, banyak class End Class
ar.dll
7
Di .Net 4.0 Anda dapat melakukan: BeginInvoke ((Action) MyTextBox.SelectAll);
JoelFan
2
Sayangnya, BeginInvoke tidak bekerja untuk saya (pasti karena versi Dot net saya yang sangat berdebu). "Kontrol." untuk itu tidak membantu, juga tidak menambahkan nama TextBox itu sendiri. Sendiri, dan sangat santai ...
B. Clay Shannon
2
Perhatikan, bahwa solusi ini tidak berperilaku persis seperti yang dijelaskan dalam pertanyaan. Secara khusus 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 :)
Marcus Mangelsdorf
30

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.

public class MyTextBox : System.Windows.Forms.TextBox
{
    private bool _focused;

    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        if (MouseButtons == MouseButtons.None)
        {
            SelectAll();
            _focused = true;
        }
    }

    protected override void OnLeave(EventArgs e)
    {
        base.OnLeave(e);
        _focused = false;
    }

    protected override void OnMouseUp(MouseEventArgs mevent)
    {
        base.OnMouseUp(mevent);
        if (!_focused)
        {
            if (SelectionLength == 0)
                SelectAll();
            _focused = true;
        }
    }
}
nzhenry
sumber
2
+1 untuk saran kotak teks khusus dan solusi yang berfungsi sempurna!
Dipicu
Solusi hebat. Menyalin kode Anda tepat ke solusi saya, mengubah namespace untuk melindungi yang tidak bersalah, dan bekerja dengan sempurna. Terima kasih!
kenswdev
8

Agak kludgey, tetapi dalam acara klik Anda, gunakan SendKeys.Send( "{HOME}+{END}" );.

Todd Benning
sumber
Woofta! Itu sedikit peretasan! :-) Terima kasih untuk sarannya. Ada ide yang lebih baik?
Yehuda Gabriel Himango
Meretas memang, tapi ini tidak terdengar buruk sama sekali
Terry
3
Pertimbangkan bahwa banyak program anti-virus mencegat dan memblokir KIRIM KUNCI sebagai berbahaya. Itu bukan solusi yang bagus.
Yehuda Gabriel Himango
4

Klik acara kotak teks? Atau bahkan acara MouseCaptureChanged bekerja untuk saya. - BAIK. tidak bekerja

Jadi, Anda harus melakukan 2 hal:

private bool f = false;

private void textBox_MouseClick(object sender, MouseEventArgs e)
{ 
  if (this.f) { this.textBox.SelectAll(); }
  this.f = false;
}

private void textBox_Enter(object sender, EventArgs e)
{
  this.f = true;
  this.textBox.SelectAll();
}
private void textBox_MouseMove(object sender, MouseEventArgs e) // idea from the other answer
{
  this.f = false; 
}

Berfungsi untuk menabrak (melalui kotak teks ke kotak) juga - panggil SelectAll () di Enter untuk berjaga-jaga ...

Jakub Kotrla
sumber
Ok Jakub, itu sebagian berfungsi. Jika saya tab ke kotak teks, itu perlu fokus. Apakah itu akan berhasil dengan solusi Anda? (Jika Anda dapat menunjukkan kepada saya caranya, saya akan menandai jawaban Anda sebagai jawaban yang benar.)
Judah Gabriel Himango
Jakub, sekarang Anda telah memposting kode, tampaknya kadang - kadang berfungsi. Tidak selalu; sekarang saya mengklik ke dalam kotak teks dan tidak memilih semua.
Yehuda Gabriel Himango
Kadang-kadang saya akan mengklik ke dalam teks dan tidak memilih semua. Sepertinya entah bagaimana bidang .f tidak disetel seperti seharusnya, dan kemudian SelectAll tidak dipanggil. Belum lihat ini?
Yehuda Gabriel Himango
Saya hanya tahu bahwa karena mouseMouve Anda dapat memperlambat klik sambil menggerakkan mouse (terutama pada huruf lebar) -> unset the flag. Anda dapat menghapus kode di acara mouseMove, tetapi daripada yang Anda dapatkan - setelah tabbgin untuk mengontrol dan kemudian mengklik - pilih kembali - tidak dapat memilih bagian dari pengadukan pada drag pertama
Jakub Kotrla
4

Jawaban satu baris yang saya gunakan ... Anda mungkin menendang diri sendiri ...

Di Enter Event:

txtFilter.BeginInvoke (MethodInvoker baru (txtFilter.SelectAll));


sumber
1
Tidak, tidak bekerja. Ini memilih semua teks, oke, tetapi juga mencegah pengguna memilih hanya bagian dari teks, di antara masalah lainnya.
Judah Gabriel Himango
Maaf, saya pasti salah paham dengan perilaku yang Anda cari. Pada enter itu memilih semua, jika Anda mengklik dan menahannya pilih dari awal hingga kursor Anda. Saya kira Anda bisa menggunakan apa yang saya miliki dan mengganti SelectAll dengan logika pilihan Anda sendiri. notifywire.com/demos/2009-04-14_1248.swf
Bagus sekali! Klik pertama memasuki kotak; lalu klik dan seret untuk memilih teks.
D_Bester
Catatan: tidak berfungsi seperti bilah alamat peramban web. Bilah alamat browser web memungkinkan Anda untuk mengarahkan mouse ke bawah di kotak teks dan menyeret / memilih, bahkan ketika kotak teks belum memiliki fokus. Solusi ini tidak menyelesaikannya. Jika Anda setuju dengan itu, keren, tetapi tidak memenuhi persyaratan pertanyaan ini.
Yehuda Gabriel Himango
3
'Inside the Enter event
TextBox1.SelectAll();

Ok, setelah mencobanya di sini adalah yang Anda inginkan:

  • Pada Enter event, mulailah flag yang menyatakan bahwa Anda telah berada di enter event
  • Pada acara Klik, jika Anda mengatur bendera, panggil .Pilih Semua () dan setel ulang bendera.
  • Pada acara MouseMove, atur bendera yang dimasukkan ke false, yang memungkinkan Anda mengklik sorot tanpa harus memasukkan kotak teks terlebih dahulu.

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:

    bool entered = false;
    private void textBox1_Enter(object sender, EventArgs e)
    {
        entered = true;
        textBox1.SelectAll();   //From Jakub's answer.
    }

    private void textBox1_Click(object sender, EventArgs e)
    {
        if (entered) textBox1.SelectAll();
        entered = false;
    }

    private void textBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (entered) entered = false;
    }

Bagi saya, tab ke kontrol memilih semua teks.

MagicKat
sumber
Solusi Anda mirip dengan solusi Jakub. Ini berfungsi untuk mengklik. Bisakah itu bekerja ketika menabrak kotak teks? (Misalnya, menabrak bilah alamat peramban Anda akan memilih semua teks juga.)
Judah Gabriel Himango
Ya itu berfungsi untuk tab juga. Saya menulis aplikasi pengujian dan ini adalah cara saya membuatnya berfungsi.
MagicKat
Tampaknya tidak berfungsi untuk tab. Bisakah Anda menunjukkan kode yang berfungsi untuk tab?
Yehuda Gabriel Himango
3

Inilah fungsi pembantu yang membawa solusi ke tingkat selanjutnya - digunakan kembali tanpa warisan.

    public static void WireSelectAllOnFocus( TextBox aTextBox )
    {
        bool lActive = false;
        aTextBox.GotFocus += new EventHandler( ( sender, e ) =>
        {
            if ( System.Windows.Forms.Control.MouseButtons == MouseButtons.None )
            {
                aTextBox.SelectAll();
                lActive = true;
            }
        } );

        aTextBox.Leave += new EventHandler( (sender, e ) => {
            lActive = false;
        } );

        aTextBox.MouseUp += new MouseEventHandler( (sender, e ) => {
            if ( !lActive )
            {
                lActive = true;
                if ( aTextBox.SelectionLength == 0 ) aTextBox.SelectAll();
            }   
        });
    }

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.

Ross K.
sumber
2

Ini bekerja untuk WPF / XAML TextBox.

    private bool initialEntry = true;
    private void TextBox_SelectionChanged(object sender, RoutedEventArgs e)
    {
        if (initialEntry)
        {
            e.Handled = true;
            initialEntry = false;
            TextBox.SelectAll();
        }
    }
    private void TextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        TextBox.SelectAll();
        initialEntry = true;      
    }
jorok
sumber
2

Ini mirip dengan jawaban populer nzhenry , tetapi saya merasa lebih mudah untuk tidak perlu subkelas:

Private LastFocused As Control = Nothing

Private Sub TextBox1_Enter(sender As Object, e As System.EventArgs) Handles TextBox1.Enter, TextBox2.Enter, TextBox3.Enter
    If MouseButtons = Windows.Forms.MouseButtons.None Then LastFocused = sender
End Sub

Private Sub TextBox1_Leave(sender As Object, e As System.EventArgs) Handles TextBox1.Leave, TextBox2.Leave, TextBox3.Leave
    LastFocused = Nothing
End Sub

Private Sub TextBox1_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseUp, TextBox2.MouseUp, TextBox3.MouseUp
    With CType(sender, TextBox)
        If LastFocused IsNot sender AndAlso .SelectionLength = 0 Then .SelectAll()
    End With
    LastFocused = sender
End Sub
Chris
sumber
1

SelectAll tidak pernah bekerja untuk saya.

Ini bekerja.

ActiveControl = textBox1;
textBox1->SelectionStart = 0;
textBox1->SelectionLength = textBox1->Text->Length;
Adam Bruss
sumber
Itu tidak memperhitungkan kasus di mana menabrak ke dalam kotak teks membawa fokus. Itu juga menunjukkan beberapa masalah lain yang dibahas dalam utas ini.
Yehuda Gabriel Himango
1

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:

private void textBox1_Click(object sender, EventArgs e){
        textBox1_Enter(sender, e);
    }

private void textBox1_Enter(object sender, EventArgs e){
        TextBox tb = ((TextBox)sender);
        tb.SelectAll();
    }
Pieter Heemeryck
sumber
Ini tidak berfungsi untuk fokus melalui tab ke kontrol, kan? Juga, bagaimana ketika Anda ingin memilih beberapa teks tanpa memilih semua?
Yehuda Gabriel Himango
Sebenarnya, itu berhasil dengan menabraknya! Saya baru saja mengujinya dalam proyek dummy menggunakan MS Visual C # 2010. Yang mengganggu dengan solusi ini adalah bahwa Anda tidak dapat memilih beberapa teks tanpa memilih semua. Jika Anda ingin melakukan hal itu, tentu saja tidak diperlukan kode, Anda bisa menggunakan mouse dan memilihnya (atau menggunakan keyboard).
Pieter Heemeryck
Dan itulah sebabnya solusi ini tidak menyelesaikan masalah yang disajikan: tidak berperilaku seperti kotak alamat peramban, karena Anda tidak dapat mengklik setiap bagian dari alamat tanpa memilih semua teks.
Yehuda Gabriel Himango
Oke, saya mengerti maksud Anda. Judul pertanyaan dan contoh bilah alamat browser web tidak menunjukkan bahwa Anda harus dapat memilih beberapa bagian teks. Anda hanya menyebutkan ini sebagai bagian dari kalimat terakhir pertanyaan Anda. Salam.
Pieter Heemeryck
0
private bool _isSelected = false;
private void textBox_Validated(object sender, EventArgs e)
{
    _isSelected = false;
}

private void textBox_MouseClick(object sender, MouseEventArgs e)
{
    SelectAllText(textBox);
}

private void textBox_Enter(object sender, EventArgs e)
{
    SelectAllText(textBox);
}

private void SelectAllText(TextBox text)
{
    if (!_isSelected)
    {
        _isSelected = true;
        textBox.SelectAll();
    }
}
Nescio
sumber
Saya baru saja menguji dengan RichTextBox. Tidak bekerja Mengklik ke dalam kotak teks tidak muncul untuk memilih semua teks. (Karena semakin tidak dipilih pada mouse ke bawah, ketika tanda sisipan ditempatkan pada kursor.)
Judah Gabriel Himango
0

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
Menarik, tetapi saya benar-benar membutuhkan ini untuk bekerja pada TextBox dan RichTextBox.
Yehuda Gabriel Himango
0

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 .:

private void textbox_MouseDown(object sender, MouseEventArgs e) {
    if (textbox != null && !string.IsNullOrEmpty(textbox.Text))
    {
        textbox.SelectAll();
    } }

sumber
Tidak, masalah pasangan dengan ini: tidak memperhitungkan jika kotak teks sudah memiliki fokus (kami tidak ingin memilih semua mouse semua, hanya ketika kotak teks tidak memiliki fokus), jangan biarkan Anda memilih hanya sebagian teks, tidak berfungsi saat membawa fokus melalui tab ke kotak teks.
Yehuda Gabriel Himango
0

Saya menelepon SelectAll inside MouseUp event dan bekerja dengan baik untuk saya.

    private bool _tailTextBoxFirstClick = false;

    private void textBox1_MouseUp(object sender, MouseEventArgs e)
    {
        if(_textBoxFirstClick)           
            textBox1.SelectAll();

        _textBoxFirstClick = false;
    }  

    private void textBox1_Leave(object sender, EventArgs e)
    {
        _textBoxFirstClick = true;
        textBox1.Select(0, 0);
    }
Sreejith K.
sumber
Ya, lihat jawaban lain (dan komentar) mengapa ini tidak berhasil di semua skenario.
Yehuda Gabriel Himango
Saya tidak memeriksa tab untuk solusi ini. Salahku. Terima kasih telah menunjukkan. Senang melihat bahwa Anda memiliki solusi lengkap sekarang. Dan juga senang mengetahui bahwa saran saya untuk MouseUp termasuk dalam solusi Anda.
Sreejith K.
0

Turunkan kelas dari TextBox atau MaskedTextBox:

public class SMaskedTextBox : MaskedTextBox
{
    protected override void OnGotFocus(EventArgs e)
    {
        base.OnGotFocus(e);
        this.SelectAll();
    }
}

Dan gunakan pada formulir Anda.

Mohammad Mahdipour
sumber
Ini tidak berhasil. Untuk memahami alasannya, lihat jawaban dan komentar lainnya.
Yehuda Gabriel Himango
0

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:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.textBox1.GotFocus += new EventHandler(textBox1_GotFocus);
    }

    private delegate void SelectAllDelegate();    
    private IAsyncResult _selectAllar = null; //So we can clean up afterwards.

    //Catch the input focus event
    void textBox1_GotFocus(object sender, EventArgs e)
    {
        //We could have gotten here many ways (including mouse click)
        //so there could be other messages queued up already that might change the selection.
        //Don't call SelectAll here, since it might get undone by things such as positioning the cursor.
        //Instead use BeginInvoke on the form to queue up a message
        //to select all the text after everything caused by the current event is processed.
        this._selectAllar = this.BeginInvoke(new SelectAllDelegate(this._SelectAll));
    }

    private void _SelectAll()
    {
        //Clean-up the BeginInvoke
        if (this._selectAllar != null)
        {
            this.EndInvoke(this._selectAllar);
        }
        //Now select everything.
        this.textBox1.SelectAll();
    }
}
Peter Mortensen
sumber
Ali, ini tidak berhasil. Coba letakkan di tengah teks. Tahan tombol mouse selama 1 detik.
Yehuda Gabriel Himango
0

Untuk sekelompok kotak teks dalam formulir:

private System.Windows.Forms.TextBox lastFocus;   

private void textBox_GotFocus(object sender, System.Windows.Forms.MouseEventArgs e)   
{
    TextBox senderTextBox = sender as TextBox;
    if (lastFocus!=senderTextBox){
        senderTextBox.SelectAll();
    }
    lastFocus = senderTextBox;   
}
Yfiua
sumber
1
Ini tidak berfungsi dengan baik; lihat balasan saya untuk jawaban lain yang menyarankan. Pilih Semua (). Ini tidak berfungsi karena jika Anda memasukkan kotak teks saat mencoba memilih teks, itu merusak pilihan teks Anda dengan memilih semua teks. Anda hanya ingin memilih teks jika fokus memasukkan kotak teks melalui mouse ke atas atau menabraknya, tetapi jika fokus disebabkan oleh mouse ke bawah.
Yehuda Gabriel Himango
0

Saya tahu ini sudah diselesaikan tetapi saya punya saran yang menurut saya sebenarnya agak sederhana.

Dalam acara mouse yang harus Anda lakukan adalah menempatkan

if(textBox.SelectionLength = 0)
{
    textBox.SelectAll();
}

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 ....

Eluem
sumber
1
Permintaan asli ingin ini berfungsi saat Anda masuk ke bidang juga.
Don Kirkby
2
Yap, ini tidak berfungsi untuk semua skenario. Ini hanya berfungsi ketika Anda mengklik ke dalam kotak teks. Dan meskipun begitu, jika tidak berperilaku sebagai bilah alamat peramban berperilaku ketika pemilihan sudah ada di kotak teks.
Yehuda Gabriel Himango
0

Solusi berikut ini berfungsi untuk saya. Saya menambahkan OnKeyDowndan OnKeyUpmenimpa acara untuk menjaga teks TextBox selalu dipilih.

    public class NumericTextBox : TextBox
{
    private bool _focused;
    protected override void OnGotFocus(EventArgs e)
    {
        base.OnGotFocus(e);
        if (MouseButtons == MouseButtons.None)
        {
            this.SelectAll();
            _focused = true;
        }
    }
    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        if (MouseButtons == MouseButtons.None)
        {
            SelectAll();
            _focused = true;
        }
    }

    protected override void OnLeave(EventArgs e)
    {
        base.OnLeave(e);
        _focused = false;
    }

    protected override void OnMouseUp(MouseEventArgs mevent)
    {
        base.OnMouseUp(mevent);
        if (!_focused)
        {
            if (SelectionLength == 0)
                SelectAll();
            _focused = true;
        }
    }

    protected override void OnKeyUp(KeyEventArgs e)
    {
        base.OnKeyUp(e);

        if (SelectionLength == 0)
            SelectAll();
        _focused = true;
    }
    protected override void OnKeyDown(KeyEventArgs e)
    {
       base.OnKeyDown(e);
       if (SelectionLength == 0)
            SelectAll();
        _focused = true;
    }
}
abrfra
sumber
2
Apakah ini memungkinkan Anda untuk mengarahkan mouse ke kotak teks, seret kursor Anda untuk memilih beberapa teks, lalu arahkan mouse ke atas?
Yehuda Gabriel Himango
0

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.

private void maskedTextBox1_Leave(object sender, CancelEventArgs e)
    {
        maskedTextBox1.SelectAll();
    }
Joel
sumber
Jika Anda masuk dengan mouse, itu harus memilih semua teks, kecuali itu sudah fokus. Ini tidak mendukung itu.
Yehuda Gabriel Himango
0

Solusi yang sangat sederhana:

    private bool _focusing = false;

    protected override void OnEnter( EventArgs e )
    {
        _focusing = true;
        base.OnEnter( e );
    }

    protected override void OnMouseUp( MouseEventArgs mevent )
    {
        base.OnMouseUp( mevent );

        if( _focusing )
        {
            this.SelectAll();
            _focusing = false;
        }
    }

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):

    protected override void WndProc( ref Message m )
    {
        if( m.Msg == 32 ) //WM_SETCURSOR=0x20
        {
              this.SelectAll(); // or your custom logic here                
        }

        base.WndProc( ref m );
    }

* 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

Mauro Sampietro
sumber
Solusi ini sudah diposting. Lihat komentar untuk jawaban yang ada untuk mencari tahu mengapa itu tidak berhasil.
Yehuda Gabriel Himango
berfungsi dengan tab dan dengan mouse, Anda bisa mendapatkan fokus, pilih teks dan kemudian mouse ke atas. Sepertinya saya tidak dapat menemukan masalah dengan ini. Bisakah Anda menunjukkannya?
Mauro Sampietro
0

Saya menemukan ini bekerja paling baik, ketika klik mouse dan tidak segera dirilis:

    private bool SearchBoxInFocusAlready = false;
    private void SearchBox_LostFocus(object sender, RoutedEventArgs e)
    {
        SearchBoxInFocusAlready = false;
    }

    private void SearchBox_PreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
        if (e.ButtonState == MouseButtonState.Released && e.ChangedButton == MouseButton.Left &&
            SearchBox.SelectionLength == 0 && SearchBoxInFocusAlready == false)
        {
            SearchBox.SelectAll();
        }

        SearchBoxInFocusAlready = true;
    }
pengguna3729779
sumber
0

Solusi saya cukup primitif tetapi berfungsi dengan baik untuk tujuan saya

private async void TextBox_GotFocus(object sender, RoutedEventArgs e)
{
    if (sender is TextBox)
    {
        await Task.Delay(100);
        (sender as TextBox).SelectAll();
    }
}
BlueWizard
sumber
Tidak berfungsi saat Anda ingin mengarahkan mouse ke bawah untuk memilih banyak teks, seret mouse Anda, lalu arahkan mouse ke atas. Kode Anda akan menghapus pilihan dan memilih semuanya.
Yehuda Gabriel Himango
@JudahHimango Jup. Jika Anda mengklik sekali saja akan memilih segalanya. Jika Anda mengklik dan menariknya hanya akan memilih pilihan. Setidaknya Browser di Firefox menunjukkan perilaku ini dengan tepat.
BlueWizard
bukankah itu kondisi balapan? Jika saya berhasil dengan cepat memilih beberapa teks dengan mouse, maka .SelectAll () akan menyala milidetik kemudian, menimpa pilihan saya.
Yehuda Gabriel Himango
1
Oke, jika Anda cepat dalam memilih sesuatu maka hal ini akan merugikan Anda.
BlueWizard
-1

Di bawah ini sepertinya berfungsi. Acara masuk menangani tab ke kontrol dan MouseDown berfungsi saat kontrol diklik.

    private ########### void textBox1_Enter(object sender, EventArgs e)
    {
        textBox1.SelectAll();
    }

    private void textBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (textBox1.Focused)
            textBox1.SelectAll();
    }
benPearce
sumber
Saya tidak beruntung, tidak berhasil. Coba pilih beberapa teks. Teks .SelectAll menimpa apa yang coba dipilih pengguna.
Yehuda Gabriel Himango
-1

Jawabannya sebenarnya bisa lebih sederhana daripada SEMUA yang di atas, misalnya (dalam WPF):

public void YourTextBox_MouseEnter(object sender, MouseEventArgs e)
    {
        YourTextBox.Focus();
        YourTextBox.SelectAll();
    }

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 ();

MDB
sumber
Ini tidak berfungsi, dan merupakan duplikat dari jawaban lain. Misalnya, jika Anda mengarahkan mouse ke bawah di kotak teks, seret, itu harus memilih bagian dari teks. Ini memecah itu dan tidak memilih semua.
Yehuda Gabriel Himango
-1

cukup gunakan selectall () pada enter dan klik acara

private void textBox1_Enter(object sender, EventArgs e)
        {

            textBox1.SelectAll();
        }
        private void textBox1_Click(object sender, EventArgs e)
        {
            textBox1.SelectAll();
        }
EKanadily
sumber
Itu berfungsi sampai Anda ingin memilih beberapa teks. Lihat jawaban lain untuk penjelasan lengkap.
Yehuda Gabriel Himango
-1

Saya membuat proyek VB.Net Wpf baru. Saya membuat satu TextBox dan menggunakan yang berikut ini untuk codebehind:

Class MainWindow 

    Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        AddHandler PreviewMouseLeftButtonDown, New MouseButtonEventHandler(AddressOf SelectivelyIgnoreMouseButton)
        AddHandler GotKeyboardFocus, New KeyboardFocusChangedEventHandler(AddressOf SelectAllText)
        AddHandler MouseDoubleClick, New MouseButtonEventHandler(AddressOf SelectAllText)
    End Sub

    Private Shared Sub SelectivelyIgnoreMouseButton(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
        ' Find the TextBox
        Dim parent As DependencyObject = TryCast(e.OriginalSource, UIElement)
        While parent IsNot Nothing AndAlso Not (TypeOf parent Is TextBox)
            parent = VisualTreeHelper.GetParent(parent)
        End While

        If parent IsNot Nothing Then
            Dim textBox As Object = DirectCast(parent, TextBox)
            If Not textBox.IsKeyboardFocusWithin Then
                ' If the text box is not yet focussed, give it the focus and
                ' stop further processing of this click event.
                textBox.Focus()
                e.Handled = True
            End If
        End If
    End Sub

    Private Shared Sub SelectAllText(ByVal sender As Object, ByVal e As RoutedEventArgs)
        Dim textBox As Object = TryCast(e.OriginalSource, TextBox)
        If textBox IsNot Nothing Then
            textBox.SelectAll()
        End If
    End Sub

End Class
BSalita
sumber