Jak usunąć fokus z TextBox w WinForms?


110

Muszę usunąć fokus z kilku pól tekstowych. Próbowałem użyć:

textBox1.Focused = false;

ReadOnlyWartość jego właściwości to true.

Następnie próbowałem ustawić fokus na formularzu, aby usunąć go ze wszystkich pól tekstowych, ale to również nie działa:

this.Focus();

a funkcja powraca falsepo zaznaczeniu pola tekstowego.

Jak więc usunąć fokus z TextBox?

Odpowiedzi:


113

Potrzebujesz innego elementu sterującego, na który można ustawić fokus.

Zauważ, że możesz ustawić fokus na etykietę. Możesz zastanowić się, dokąd chcesz, aby klawisz [Tab] zajął to następne.

Pamiętaj również, że nie możesz ustawić go na Form. Kontrolki kontenera, takie jak Form i Panel, przekażą fokus do ich pierwszej kontrolki podrzędnej. Może to być TextBox, od którego chcesz, aby się odsunął.


Dzięki; Właśnie próbowałem skupić się na etykiecie i teraz pole tekstowe staje się nieostre. Wygląda na to, że z jakiegoś powodu nie możesz skupić się na formularzu.
Callum Rogers

7
Kontrolki kontenera (formularz, panel) przekażą fokus do ich pierwszej kontrolki podrzędnej.
Henk Holterman

Świetna sugestia. To rozwiązało mój problem. Używam KeyPress przeciwko samemu formularzowi i mam kilka przycisków itp. Problem polega na tym, że aplikacja pobiera dane z czytnika kart, więc jeśli fokus odejdzie od samego formularza, rozpęta się piekło. Skoncentrowanie się na etykiecie po kliknięciu przycisku rozwiązało mój problem. Dzięki wielkie!
joelc

62

Skupienie się na etykiecie nie zadziałało, robiąc coś takiego, label1.Focus()prawda? pole tekstowe nadal ma fokus podczas ładowania formularza, jednak wypróbowanie odpowiedzi Velociraptors zadziałało, ustawiając formant Active Form na etykietę w następujący sposób:

private void Form1_Load(object sender, EventArgs e)  
{ 
    this.ActiveControl = label1;       
}

7
Chciałabym dać ci milion strzał w górę. próbowałem WSZYSTKIEGO, co sugerowali ludzie, tylko to działało. z jakiegoś powodu pole tekstowe ZAWSZE
kradło

3
Działa to również w przypadku kontrolek kontenerów, takich jak panele. Chciałem tylko całkowicie usunąć ostrość i zadziałało:this.ActiveControl = panelOnMyForm;
Tim Schmelter,

52

Możesz dodać następujący kod:

this.ActiveControl = null;  //this = form

7
Uważam, że to najlepsza odpowiedź. Wiele innych metod, takich jak „Focus”, jeśli czytasz MSDN, jest wymienionych jako metody niskiego poziomu dla projektantów formantów. Jeśli chcesz, aby wszystko inne było „niewybrane”, wydaje się, że jest to najłatwiejsze podejście, ponieważ to tylko jedna mała linia.
Rostów

1
To może być połowa powodu, dla którego Microsoft dodał tę właściwość w pierwszej kolejności.
Panzercrisis

Wydaje się, że to najbardziej eleganckie rozwiązanie, w moim przypadku sprawdziło się idealnie.
NetWave

Naprawdę chcę, aby ta odpowiedź działała, ponieważ po prostu wydaje się, że powinna, ale w moim przypadku nie zadziałała, ponieważ chociaż wyzwoliła zdarzenie Leave, nie wywołała zdarzeń Validating / Validated.
Rhys Jones

32

Spróbuj wyłączyć i włączyć pole tekstowe.


5
Działa to całkiem sprytnie, ponieważ w międzyczasie automatycznie wybiera następną kontrolkę na liście kart.
Nick

3
Programuję w Silverlight przy użyciu MVVM i zaimplementowałem to przy użyciu zachowania ukierunkowanego na TextBox. Ponieważ nie miałem innego UIElement pod ręką, aby ustawić fokus na rozwiązanie Wyłącz / Włącz, zdziałało cuda. Dzięki!
Albert Oldfield,

Jak mogę to wyłączyć?
miguelmpn

1
@miguelmpn textBox1.Enabled = false;wyłączy twoje pole tekstowe. a ustawienie go trueponownie włączy.
Raktim Biswas

24

Można również ustawić form activecontrolwłasności do nulljak

ActiveControl = null;

7
Mam nadzieję, że ludzie przewinąć w dół, aż do tego, a nie tylko korzystać z obejścia oznaczony jako odpowiedź
makoshichi

Wciąż najlepsza odpowiedź do dnia dzisiejszego, kolego, weź moje poparcie.
xoxel

8

Focusustawia fokus wprowadzania, więc ustawienie go na formularz nie zadziała, ponieważ formularze nie akceptują danych wejściowych. Spróbuj ustawić właściwość formularza na ActiveControlinną kontrolkę. Można również użyć Selectdo wybrania określonej kontrolki lub SelectNextControldo wybrania następnej kontrolki w kolejności tabulacji.


1
Próbowałem wszystkiego innego tutaj i Select()pracowałem dla mnie.
Derek W

8

Spróbuj tego:

Najpierw skonfiguruj kolejność zakładek.

Następnie w przypadku ładowania formularza możemy wysłać programowo naciśnięcie klawisza tabulatora do aplikacji. Tak więc ta aplikacja ustawi fokus na pierwszy element sterujący w kolejności tabulacji.

w formie load nawet napisz tę linię.

SendKeys.Send("{TAB}");

To zadziałało dla mnie.


4

Ten post doprowadził mnie do tego:

ActiveControl = null;

Dzięki temu mogę uchwycić wszystkie wejścia klawiatury na najwyższym poziomie bez innych elementów sterujących zwariowanych.


3

Znalazłem dobrą alternatywę! U mnie działa najlepiej, bez skupiania się na czymś innym.

Spróbuj tego:

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

3

Zrobiłem to na mojej niestandardowej kontrolce, zrobiłem to na Focus ()

this.Parent.Focus();

Więc jeśli skupia się na texboksie - natychmiast skupia się na nadrzędnym polu tekstowym (formularz lub panel ...) Jest to dobra opcja, jeśli chcesz zrobić to na niestandardowej kontroli.


2

Wygląda na to, że nie muszę skupiać się na żadnych innych elementach. W aplikacji Windows Phone 7 używałem metody Fokus, aby usunąć fokus pola tekstowego.

Podanie następującego polecenia spowoduje, że fokus nie zostanie ustawiony na nic:

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

U mnie zadziałało, ale nie wiem, dlaczego u Ciebie nie zadziałało: /


2

Prostym rozwiązaniem byłoby zabicie koncentracji, po prostu stwórz własną klasę:

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

Dokładnie takiego rozwiązania, jakiego szukałem. Dzięki!
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();
                });
            }
        }
    }

0

Sposób, w jaki się z tym obchodzę, polega na umieszczeniu wszystkich kontrolek winform. Wszystkie etykiety i elementy sterujące, które nie są wybierane, tworzę jako kolejność tabulacji 0, a następnie moją pierwszą kontrolkę jako kolejność tabulacji 2, a następnie zwiększam kolejność każdej kontrolki do wyboru o 1, więc 3, 4, 5 itd.

W ten sposób, gdy uruchamiają się moje Winformy, pierwszy TextBox nie jest aktywny!


0

możesz to zrobić na dwa sposoby

  • po prostu zmień właściwości "TabStop" żądanego pola tekstowego na false, teraz nie będzie się skupiać, nawet jeśli masz jedno pole tekstowe
  • przeciągnij dwa pola tekstowe

    1. uczyń widoczny, na którym nie chcesz foucus, czyli textbox1
    2. uczyń drugą niewidoczną i przejdź do właściwości tego pola tekstowego i wybierz

wartość tabindex na 0 z textbox2

  1. i wybierz tabindex swojego pola tekstowego od 1 do 1, teraz nie będzie się ono koncentrować na polu tekstowym 1

0

Jeśli chcesz tylko efektu optycznego, że pole tekstowe nie ma niebieskiego zaznaczenia na całej zawartości, po prostu nie zaznaczaj tekstu:

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

Po tym, podczas dodawania treści za pomocą .Text += "...", nie będzie widać niebieskiego wyboru.


0

Spróbuj ustawić TabStopsię Falsedo kontrolki widoku, który nie jest być skoncentrowany.

Na przykład:

txtEmpID.TabStop = false;

-1

W konstruktorze Form lub UserControl przechowującym TextBox write

SetStyle(ControlStyles.Selectable, false);

Po InitializeComponent (); Źródło: https://stackoverflow.com/a/4811938/5750078

Przykład:

public partial class Main : UserControl
{

    public Main()
    {
        InitializeComponent();
        SetStyle(ControlStyles.Selectable, false);
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.