Bagaimana cara menghapus fokus dari TextBox di WinForms?

110

Saya perlu menghapus fokus dari beberapa TextBox. Saya mencoba menggunakan:

textBox1.Focused = false;

Its ReadOnlynilai properti adalah true.

Saya kemudian mencoba mengatur fokus pada formulir, untuk menghapusnya dari semua TextBox, tetapi ini juga gagal berfungsi:

this.Focus();

dan fungsi kembali falseketika kotak teks dipilih.

Jadi, bagaimana cara menghapus fokus dari TextBox?

Callum Rogers
sumber

Jawaban:

113

Anda memerlukan kontrol lain yang dapat difokuskan untuk memindahkan fokus.

Perhatikan bahwa Anda bisa mengatur Fokus ke Label. Anda mungkin ingin mempertimbangkan ke mana Anda ingin tombol [Tab] untuk membawanya selanjutnya.

Perhatikan juga bahwa Anda tidak dapat mengaturnya ke Formulir. Kontrol penampung seperti Formulir dan Panel akan meneruskan Fokus ke kontrol anak pertama mereka. Yang bisa menjadi TextBox yang Anda inginkan untuk dipindahkan.

Henk Holterman
sumber
Terima kasih; Saya baru saja mencoba fokus pada label dan sekarang kotak teks menjadi tidak fokus. Sepertinya Anda tidak bisa fokus pada formulir karena alasan tertentu.
Callum Rogers
7
Kontrol Penampung (Formulir, Panel) akan meneruskan Fokus ke kontrol anak pertama mereka.
Henk Holterman
Saran bagus. Ini memecahkan masalah saya. Saya menggunakan KeyPress terhadap formulir itu sendiri dan memiliki beberapa tombol, dll. Masalahnya adalah bahwa aplikasi mengambil masukan dari pembaca kartu, jadi jika fokus hilang dari formulir itu sendiri maka semua akan lepas. Fokus pada label setelah mengklik tombol menyelesaikan masalah saya. Terima kasih banyak!
joelc
62

Berfokus pada label tidak berhasil untuk saya, melakukan sesuatu seperti yang label1.Focus()benar? kotak teks masih memiliki fokus saat memuat formulir, namun mencoba jawaban Velociraptors , berhasil untuk saya, menyetel kontrol Aktif Formulir ke label seperti ini:

private void Form1_Load(object sender, EventArgs e)  
{ 
    this.ActiveControl = label1;       
}
Mengapa serius sekali
sumber
7
Saya berharap saya bisa memberi Anda jutaan panah ke atas. Saya mencoba SEMUA hal lain yang disarankan orang, ini adalah satu-satunya yang berhasil. untuk beberapa alasan, kotak teks SELALU mencuri fokus dari segalanya ...
eladyanai
3
Ini juga berfungsi untuk kontrol kontainer seperti panel. Saya hanya ingin menghapus fokus sepenuhnya dan berhasil:this.ActiveControl = panelOnMyForm;
Tim Schmelter
52

Anda dapat menambahkan kode berikut:

this.ActiveControl = null;  //this = form
FTheGodfather
sumber
7
Saya yakin ini adalah jawaban terbaik. Banyak metode lain seperti "Fokus" jika Anda membaca MSDN, terdaftar sebagai metode tingkat rendah untuk perancang kendali. Jika Anda ingin yang lainnya "tidak dipilih", ini tampaknya merupakan pendekatan yang paling mudah karena, yah, itu hanya satu baris kecil.
Rostov
1
Ini mungkin setengah dari alasan Microsoft menambahkan properti ini di tempat pertama.
Panzercrisis
Ini sepertinya solusi paling elegan, ini bekerja dengan sempurna dalam kasus saya.
NetWave
Saya benar-benar ingin jawaban ini berfungsi karena sepertinya memang seharusnya, tetapi dalam kasus saya itu tidak berhasil karena meskipun itu memicu peristiwa Keluar, itu tidak memicu peristiwa Validasi / Divalidasi.
Rhys Jones
32

Coba nonaktifkan dan aktifkan kotak teks.

Spencer Ruport
sumber
5
Ini berfungsi cukup licin karena secara otomatis memilih kontrol berikutnya dalam daftar tab untuk sementara.
Nick
3
Saya mengembangkan di Silverlight menggunakan MVVM dan menerapkan ini menggunakan perilaku yang menargetkan TextBox. Karena saya tidak memiliki UIElement lain yang berguna untuk mengatur fokus ke solusi Nonaktifkan / Aktifkan bekerja dengan sangat baik. Terima kasih!
Albert Oldfield
Bagaimana cara menonaktifkannya?
miguelmpn
1
@miguelmpn textBox1.Enabled = false;akan menonaktifkan kotak teks Anda. dan menyetelnya ke trueakan mengaktifkannya kembali.
Raktim Biswas
24

Anda juga dapat mengatur activecontrolproperti formulir menjadi nullsuka

ActiveControl = null;
marcigo36
sumber
7
Saya harap orang-orang menggulir ke bawah sampai ke ini dan tidak hanya menggunakan solusi yang ditandai sebagai jawaban
makoshichi
Masih jawaban terbaik sampai hari ini, ini sobat, terima upvote saya.
xoxel
8

Focusmengatur fokus input, jadi pengaturan ke formulir tidak akan berfungsi karena formulir tidak menerima input. Coba atur ActiveControlproperti formulir ke kontrol yang berbeda. Anda juga dapat menggunakan Selectuntuk memilih kontrol tertentu atau SelectNextControluntuk memilih kontrol berikutnya dalam urutan tab.

Velociraptors
sumber
1
Mencoba semua yang lain di sini dan Select()berhasil untuk saya.
Derek W
8

Coba yang ini:

Pertama atur urutan tab.

Kemudian dalam bentuk event load kita dapat mengirim tekan tombol tab secara terprogram ke aplikasi. Sehingga aplikasi akan memberikan fokus pada kontrol pertama pada urutan tab.

dalam bentuk memuat bahkan menulis baris ini.

SendKeys.Send("{TAB}");

Ini berhasil untuk saya.

charith rasanga
sumber
4

Posting ini mengarahkan saya untuk melakukan ini:

ActiveControl = null;

Ini memungkinkan saya untuk menangkap semua input keyboard di tingkat atas tanpa kontrol lain menjadi kacau.

Kristopher Ives
sumber
3

Saya telah menemukan alternatif yang bagus! Ini bekerja paling baik untuk saya, tanpa menetapkan fokus pada hal lain.

Coba itu:

private void richTextBox_KeyDown(object sender, KeyEventArgs e)
{    
    e.SuppressKeyPress = true;
}
kaspi
sumber
3

Saya membuat ini di kontrol kustom saya, saya melakukan ini di onFocus ()

this.Parent.Focus();

Jadi jika texbox terfokus - itu langsung fokus pada kotak teks induk (formulir, atau panel ...) Ini adalah pilihan yang baik jika Anda ingin membuat ini pada kontrol khusus.

Tommix
sumber
2

Sepertinya saya tidak perlu mengatur fokus ke elemen lain. Pada aplikasi Windows Phone 7, saya telah menggunakan metode Fokus untuk menghapus Fokus dari Kotak Teks.

Memberikan perintah berikut akan membuat fokus menjadi tidak ada:

void SearchBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        Focus();
    }
}

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx

Itu berhasil untuk saya, tetapi saya tidak tahu mengapa itu tidak berhasil untuk Anda: /

Bhawk1990
sumber
2

Solusi sederhana adalah dengan mematikan fokus, buat saja kelas Anda sendiri:

public class ViewOnlyTextBox : System.Windows.Forms.TextBox {
    // constants for the message sending
    const int WM_SETFOCUS = 0x0007;
    const int WM_KILLFOCUS = 0x0008;

    protected override void WndProc(ref Message m) {
        if(m.Msg == WM_SETFOCUS) m.Msg = WM_KILLFOCUS;

        base.WndProc (ref m);
    }
}
VladL
sumber
Persis seperti solusi yang saya cari. Terima kasih!
LeftyCoder
1
    //using System;
    //using System.Collections.Generic;
    //using System.Linq;

    private void Form1_Load(object sender, EventArgs e)
    {
        FocusOnOtherControl(Controls.Cast<Control>(), button1);
    }

    private void FocusOnOtherControl<T>(IEnumerable<T> controls, Control focusOnMe) where T : Control
    {
        foreach (var control in controls)
        {
            if (control.GetType().Equals(typeof(TextBox)))
            {
                control.TabStop = false;
                control.LostFocus += new EventHandler((object sender, EventArgs e) =>
                {                     
                    focusOnMe.Focus();
                });
            }
        }
    }
Torus
sumber
0

Cara saya menyiasatinya adalah dengan menempatkan semua kontrol winform saya. Saya membuat semua label dan kontrol winform non-pemilihan sebagai urutan tab 0, kemudian kontrol pertama saya sebagai urutan tab 2 dan kemudian menaikkan setiap urutan kontrol yang dapat dipilih sebesar 1, jadi 3, 4, 5 dll ...

Dengan cara ini, ketika Winforms saya mulai, TextBox pertama tidak memiliki fokus!

CosineCuber
sumber
0

Anda dapat melakukan ini dengan dua metode

  • cukup buat properti "TabStop" dari kotak teks yang diinginkan menjadi false sekarang ini tidak akan fokus meskipun Anda memiliki satu bidang teks
  • seret dua kotak teks

    1. buat satu terlihat di mana Anda tidak ingin foucus yaitu textbox1
    2. buat yang kedua tidak terlihat dan buka properti bidang teks itu dan pilih

nilai tabindex ke 0 dari textbox2

  1. dan pilih tabindex dari kotak teks Anda1 ke 1 sekarang tidak akan fokus pada kotak teks1
Adiii
sumber
0

Jika yang Anda inginkan hanyalah efek optik bahwa kotak teks tidak memiliki pilihan biru di seluruh isinya, cukup pilih tanpa teks:

textBox_Log.SelectionStart = 0;
textBox_Log.SelectionLength = 0;
textBox_Log.Select();

Setelah ini, saat menambahkan konten dengan .Text += "...", tidak ada pilihan biru yang akan ditampilkan.

Roland
sumber
0

Silakan coba setel TabStopke Falseuntuk kontrol tampilan Anda yang tidak difokuskan.

Misalnya:

txtEmpID.TabStop = false;
Shaheer
sumber
-1

Dalam konstruktor Formulir atau UserControl yang menahan TextBox menulis

SetStyle(ControlStyles.Selectable, false);

Setelah InitializeComponent (); Sumber: https://stackoverflow.com/a/4811938/5750078

Contoh:

public partial class Main : UserControl
{

    public Main()
    {
        InitializeComponent();
        SetStyle(ControlStyles.Selectable, false);
    }
Loaderon
sumber