Wie entferne ich den Fokus aus einer TextBox in WinForms?

110

Ich muss den Fokus von mehreren TextBoxen entfernen. Ich habe versucht:

textBox1.Focused = false;

Sein ReadOnlyEigenschaftswert ist true.

Ich habe dann versucht, den Fokus auf das Formular zu setzen, um es aus allen Textfeldern zu entfernen, aber dies funktioniert auch nicht:

this.Focus();

und die Funktion kehrt zurück, falsewenn ein Textfeld ausgewählt ist.

Wie entferne ich den Fokus von einer TextBox?

Callum Rogers
quelle

Antworten:

113

Sie benötigen eine andere fokussierbare Steuerung, um den Fokus zu verschieben.

Beachten Sie, dass Sie den Fokus auf eine Beschriftung setzen können. Möglicherweise möchten Sie überlegen, wohin die [Tab] -Taste als Nächstes führen soll.

Beachten Sie auch, dass Sie das Formular nicht festlegen können. Containersteuerelemente wie Formular und Bedienfeld geben den Fokus an das erste untergeordnete Steuerelement weiter. Welches könnte die TextBox sein, von der Sie sich entfernen möchten?

Henk Holterman
quelle
Vielen Dank; Ich habe gerade versucht, mich auf ein Etikett zu konzentrieren, und jetzt wird das Textfeld unscharf. Es scheint, dass Sie sich aus irgendeinem Grund nicht auf ein Formular konzentrieren können.
Callum Rogers
7
Container-Steuerelemente (Formular, Bedienfeld) geben den Fokus an das erste untergeordnete Steuerelement weiter.
Henk Holterman
Toller Vorschlag. Dies löste mein Problem. Ich verwende KeyPress für das Formular selbst und habe mehrere Schaltflächen usw. Das Problem ist, dass die App Eingaben von einem Kartenleser entgegennimmt. Wenn also der Fokus vom Formular selbst abweicht, bricht die Hölle los. Der Fokus auf ein Etikett nach einem Knopfdruck löste mein Problem. Vielen Dank!
Joel
62

Sich auf das Label zu konzentrieren hat bei mir nicht funktioniert, so etwas wie label1.Focus()richtig zu machen? Das Textfeld hat beim Laden des Formulars immer noch den Fokus. Der Versuch, Velociraptors zu beantworten, hat bei mir funktioniert und das aktive Steuerelement des Formulars wie folgt auf die Beschriftung gesetzt:

private void Form1_Load(object sender, EventArgs e)  
{ 
    this.ActiveControl = label1;       
}
Warum so ernst
quelle
7
Ich wünschte, ich könnte dir Millionen Pfeile geben. Ich habe ALLES andere ausprobiert, was die Leute vorgeschlagen haben. Dies ist das einzige, das funktioniert hat. aus irgendeinem Grund stahl das Textfeld IMMER den Fokus von allem ...
eladyanai
3
Dies funktioniert auch für Containersteuerelemente wie Bedienfelder. Ich wollte nur den Fokus komplett entfernen und es hat funktioniert:this.ActiveControl = panelOnMyForm;
Tim Schmelter
52

Sie können den folgenden Code hinzufügen:

this.ActiveControl = null;  //this = form
FTheGodfather
quelle
7
Ich glaube, das ist die beste Antwort. Viele andere Methoden wie "Fokus", wenn Sie MSDN lesen, werden als Low-Level-Methoden für Steuerungsdesigner aufgeführt. Wenn Sie möchten, dass alles andere "nicht ausgewählt" wird, scheint dies der einfachste Ansatz zu sein, da es sich nur um eine kleine Zeile handelt.
Rostow
1
Dies ist möglicherweise der halbe Grund, warum Microsoft diese Eigenschaft überhaupt hinzugefügt hat.
Panzercrisis
Dies scheint die eleganteste Lösung zu sein, sie hat in meinem Fall perfekt funktioniert.
NetWave
Ich möchte wirklich, dass diese Antwort funktioniert, weil es so scheint, wie es sollte, aber in meinem Fall hat es nicht funktioniert, weil es zwar das Leave-Ereignis ausgelöst hat, aber nicht die Validating / Validated-Ereignisse ausgelöst hat.
Rhys Jones
32

Versuchen Sie, das Textfeld zu deaktivieren und zu aktivieren.

Spencer Ruport
quelle
5
Dies funktioniert ziemlich schnell, da in der Zwischenzeit automatisch das nächste Steuerelement in der Registerkartenliste ausgewählt wird.
Nick
3
Ich entwickle in Silverlight mit MVVM und implementiere dies mithilfe eines Verhaltens, das auf eine TextBox abzielt. Da ich kein anderes UIElement zur Hand hatte, um mich auf die Disable / Enable-Lösung zu konzentrieren, wirkte es Wunder. Vielen Dank!
Albert Oldfield
Wie kann ich es deaktivieren?
Miguelmpn
1
@miguelmpn textBox1.Enabled = false;deaktiviert Ihr Textfeld. Wenn Sie es auf einstellen, truewird es wieder aktiviert.
Raktim Biswas
24

Sie können auch die Formen gesetzt activecontrolEigenschaft nullwie

ActiveControl = null;
marcigo36
quelle
7
Ich hoffe, die Leute scrollen den ganzen Weg nach unten und verwenden nicht nur die als Antwort gekennzeichnete
Problemumgehung
Immer noch die beste Antwort bis heute, hier Kumpel, nimm meine Gegenstimme.
Xoxel
8

FocusLegt den Eingabefokus fest, sodass das Festlegen des Formulars nicht funktioniert, da Formulare keine Eingaben akzeptieren. Versuchen Sie, die ActiveControlEigenschaft des Formulars auf ein anderes Steuerelement festzulegen. Sie können auch Selectein bestimmtes Steuerelement SelectNextControlauswählen oder das nächste Steuerelement in der Tabulatorreihenfolge auswählen.

Velociraptoren
quelle
1
Versuchte alles andere hier und Select()arbeitete für mich.
Derek W
8

Probier diese:

Richten Sie zuerst die Tab-Reihenfolge ein.

Im Formularladeereignis können wir dann programmgesteuert eine Tabulatortaste an die Anwendung senden. Diese Anwendung konzentriert sich also auf die 1. Steuerung in der Tabulatorreihenfolge.

In Form Load schreiben Sie sogar diese Zeile.

SendKeys.Send("{TAB}");

Das hat bei mir funktioniert.

Charith Rasanga
quelle
4

Dieser Beitrag hat mich dazu veranlasst:

ActiveControl = null;

Auf diese Weise kann ich alle Tastatureingaben auf der obersten Ebene erfassen, ohne dass andere Steuerelemente verrückt werden.

Kristopher Ives
quelle
3

Ich habe eine gute Alternative gefunden! Es funktioniert am besten für mich, ohne den Fokus auf etwas anderes zu legen.

Versuch das:

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

Ich habe dies auf meinem benutzerdefinierten Steuerelement gemacht, ich habe dies auf Focus () gemacht

this.Parent.Focus();

Wenn also texbox fokussiert ist, wird das übergeordnete Textfeld (Formular oder Bedienfeld ...) sofort fokussiert. Dies ist eine gute Option, wenn Sie dies auf einem benutzerdefinierten Steuerelement vornehmen möchten.

Tommix
quelle
2

Es scheint, dass ich mich nicht auf andere Elemente konzentrieren muss. In einer Windows Phone 7-Anwendung habe ich die Fokusmethode verwendet, um den Fokus eines Textfelds zu deaktivieren.

Wenn Sie den folgenden Befehl eingeben, wird der Fokus auf nichts gesetzt:

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

Es hat bei mir funktioniert, aber ich weiß nicht, warum es bei Ihnen nicht funktioniert hat: /

Bhawk1990
quelle
2

Eine einfache Lösung wäre, den Fokus zu beenden, einfach eine eigene Klasse zu erstellen:

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
quelle
Genau die Art von Lösung, nach der ich gesucht habe. Vielen Dank!
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
quelle
0

Ich komme darum herum, indem ich alle meine Winform-Steuerelemente platziere. Ich mache alle Beschriftungen und nicht ausgewählten Winform-Steuerelemente als Tabulatorreihenfolge 0, dann mein erstes Steuerelement als Tabulatorreihenfolge 2 und erhöhe dann die Reihenfolge jedes auswählbaren Steuerelements um 1, also 3, 4, 5 usw.

Auf diese Weise hat die erste TextBox beim Start meiner Winforms keinen Fokus!

CosineCuber
quelle
0

Sie können dies auf zwei Arten tun

  • Stellen Sie einfach die "TabStop" -Eigenschaften des gewünschten Textfelds auf "false". Jetzt wird der Fokus nicht mehr angezeigt, selbst wenn Sie nur ein Textfeld haben
  • Ziehen Sie zwei Textfelder

    1. Machen Sie einen sichtbar, auf dem Sie keinen Foucus möchten, nämlich Textbox1
    2. Machen Sie die zweite unsichtbar und gehen Sie zu den Eigenschaften dieses Textfelds und wählen Sie

Tabindex-Wert auf 0 von Textbox2

  1. und wählen Sie den Tabindex Ihres Textfelds1 bis 1 aus, jetzt wird es nicht mehr auf Textfeld1 fokussiert
Adiii
quelle
0

Wenn Sie nur den optischen Effekt wünschen, dass das Textfeld im gesamten Inhalt keine blaue Auswahl aufweist, wählen Sie einfach keinen Text aus:

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

Danach wird beim Hinzufügen von Inhalten mit .Text += "..."keine blaue Auswahl angezeigt.

Roland
quelle
0

Bitte versuchen Sie setzen , TabStopum Falsefür Ihre Ansicht Steuerung , die werden nicht fokussiert.

Zum Beispiel:

txtEmpID.TabStop = false;
Shaheer
quelle
-1

Im Konstruktor des Formulars oder UserControl mit der TextBox schreiben

SetStyle(ControlStyles.Selectable, false);

Nach der InitializeComponent (); Quelle: https://stackoverflow.com/a/4811938/5750078

Beispiel:

public partial class Main : UserControl
{

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