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?

Callum Rogers
źródło

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

Henk Holterman
źródło
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;       
}
Dlaczego tak poważnie
źródło
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
FTheGodfather
źródło
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.

Spencer Ruport
źródło
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;
marcigo36
źródło
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.

Velociraptors
źródło
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.

charith rasanga
źródło
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.

Kristopher Ives
źródło
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;
}
kaspi
źródło
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.

Tommix
źródło
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: /

Bhawk1990
źródł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);
    }
}
VladL
źródło
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();
                });
            }
        }
    }
Torus
źródło
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!

CosineCuber
źródło
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
Adiii
źródło
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.

Roland
źródło
0

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

Na przykład:

txtEmpID.TabStop = false;
Shaheer
źródło
-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);
    }
Loaderon
źródło