Come rimuovere lo stato attivo da una casella di testo in WinForms?


110

Devo rimuovere lo stato attivo da diversi TextBox. Ho provato a usare:

textBox1.Focused = false;

Il suo ReadOnlyvalore di proprietà è true.

Ho quindi provato a impostare il focus sul form, in modo da rimuoverlo da tutti i TextBox, ma anche questo non funziona:

this.Focus();

e la funzione ritorna falsequando viene selezionata una casella di testo.

Quindi, come rimuovo lo stato attivo da un TextBox?

Risposte:


113

Hai bisogno di qualche altro controllo attivabile per spostare lo stato attivo.

Notare che è possibile impostare il focus su un'etichetta. Potresti considerare dove vuoi che il tasto [Tab] lo porti dopo.

Notare inoltre che non è possibile impostarlo sul modulo. I controlli contenitore come modulo e pannello passeranno lo stato attivo al primo controllo figlio. Quale potrebbe essere la casella di testo da cui vuoi che si allontani.


Grazie; Ho appena provato a concentrarmi su un'etichetta e ora la casella di testo diventa sfocata. Sembra che tu non possa concentrarti su un modulo per qualche motivo.
Callum Rogers

7
I controlli contenitore (modulo, pannello) passeranno lo stato attivo al primo controllo figlio.
Henk Holterman

Ottimo suggerimento. Questo ha risolto il mio problema. Sto usando KeyPress contro il modulo stesso e ho diversi pulsanti, ecc. Il problema è che l'app riceve input da un lettore di schede, quindi se lo stato attivo si allontana dal modulo stesso, si scatena l'inferno. Concentrarmi su un'etichetta dopo aver fatto clic su un pulsante ha risolto il mio problema. Grazie mille!
joelc

62

Concentrarmi sull'etichetta non ha funzionato per me, fare qualcosa di simile, label1.Focus()giusto? la casella di testo è ancora attiva durante il caricamento del modulo, tuttavia provare a rispondere a Velociraptors ha funzionato per me, impostando il controllo attivo del modulo sull'etichetta in questo modo:

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

7
vorrei poterti dare milioni di frecce in su. Ho provato TUTTO il resto che le persone suggerivano, questo è l'unico che ha funzionato. per qualche motivo, la casella di testo ha SEMPRE rubato l'attenzione a tutto ...
eladyanai

3
Questo funziona anche per i controlli contenitore come i pannelli. Volevo solo rimuovere completamente la messa a fuoco e ha funzionato:this.ActiveControl = panelOnMyForm;
Tim Schmelter

52

Puoi aggiungere il seguente codice:

this.ActiveControl = null;  //this = form

7
Credo che questa sia la risposta migliore. Molti altri metodi come "Focus" se leggi MSDN, sono elencati come metodi di basso livello per i progettisti di controlli. Se vuoi che tutto il resto sia "non selezionato", questo sembra essere l'approccio più semplice poiché, beh, è ​​solo una piccola linea.
Rostov

1
Questa potrebbe essere la metà del motivo per cui Microsoft ha aggiunto questa proprietà in primo luogo.
Panzercrisis

Questa sembra la soluzione più elegante, ha funzionato perfettamente nel mio caso.
NetWave

Voglio davvero che questa risposta funzioni perché sembra proprio che dovrebbe, ma nel mio caso non ha funzionato perché mentre ha attivato l'evento Lascia non ha attivato gli eventi di convalida / convalida.
Rhys Jones,

32

Prova a disabilitare e abilitare la casella di testo.


5
Funziona abbastanza bene poiché seleziona automaticamente il controllo successivo nell'elenco delle schede nel frattempo.
Nick

3
Sto sviluppando in Silverlight utilizzando MVVM e l'ho implementato utilizzando un comportamento mirato a una casella di testo. Dal momento che non avevo un altro UIElement a portata di mano per impostare lo stato attivo sulla soluzione Disabilita / Abilita ha funzionato a meraviglia. Grazie!
Albert Oldfield

Come posso disabilitarlo?
miguelmpn

1
@miguelmpn textBox1.Enabled = false;disabiliterà la tua casella di testo. e impostarlo su truelo riattiverà.
Raktim Biswas

24

Puoi anche impostare la activecontrolproprietà forms su nulllike

ActiveControl = null;

7
Spero che le persone scorrano verso il basso fino a questo punto e non utilizzino semplicemente la soluzione alternativa contrassegnata come risposta
makoshichi

Ancora la migliore risposta fino ad oggi, ecco amico, accetta il mio voto positivo.
xoxel

8

Focusimposta lo stato attivo per l'input, quindi impostarlo sul modulo non funzionerà perché i moduli non accettano input. Prova a impostare la ActiveControlproprietà del modulo su un controllo diverso. È inoltre possibile utilizzare Selectper selezionare un controllo specifico o SelectNextControlper selezionare il controllo successivo nell'ordine di tabulazione.


1
Select()Ho provato tutto il resto qui e ha lavorato per me.
Derek W

8

Prova questo:

Per prima cosa imposta l'ordine di tabulazione.

Quindi nell'evento di caricamento del modulo possiamo inviare un tasto di tabulazione a livello di programmazione all'applicazione. In questo modo l'applicazione darà il focus al primo controllo nell'ordine di tabulazione.

nel caricamento del modulo scrivi anche questa riga.

SendKeys.Send("{TAB}");

Questo ha funzionato per me.


4

Questo post mi ha portato a fare questo:

ActiveControl = null;

Questo mi permette di catturare tutto l'input della tastiera al livello più alto senza che altri controlli impazziscano.


3

Ho trovato una buona alternativa! Funziona meglio per me, senza concentrarsi su qualcos'altro.

Prova questo:

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

3

L'ho fatto sul mio controllo personalizzato, l'ho fatto suFocus ()

this.Parent.Focus();

Quindi, se texbox è focalizzato - mette immediatamente a fuoco il genitore della casella di testo (modulo o pannello ...) Questa è una buona opzione se vuoi farlo sul controllo personalizzato.


2

Sembra che non sia necessario concentrare l'attenzione su altri elementi. Su un'applicazione Windows Phone 7, ho utilizzato il metodo Focus per disattivare il Focus di una casella di testo.

Dare il seguente comando non imposterà lo stato attivo su nulla:

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

Ha funzionato per me, ma non so perché non ha funzionato per te: /


2

Una soluzione semplice sarebbe eliminare il focus, creare semplicemente la tua classe:

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

Esattamente il tipo di soluzione che stavo cercando. Grazie!
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

Il modo in cui mi aggiro è posizionare tutti i miei controlli winform. Rendo tutte le etichette e i controlli winform non selezionabili come ordine di tabulazione 0, quindi il mio primo controllo come ordine di tabulazione 2 e quindi incremento l'ordine di ogni controllo selezionabile di 1, quindi 3, 4, 5 ecc ...

In questo modo, quando il mio Winform si avvia, il primo TextBox non ha il focus!


0

puoi farlo con due metodi

  • basta rendere false le proprietà "TabStop" della casella di testo desiderata ora che non si concentrerà anche se si dispone di un campo di testo
  • trascina due caselle di testo

    1. rendi visibile uno su cui non vuoi foucus che è textbox1
    2. rendi invisibile il secondo e vai alle proprietà di quel campo di testo e seleziona

valore tabindex su 0 di textbox2

  1. e seleziona il tabindex della tua casella di testo1 su 1 ora non si concentrerà sulla casella di testo1

0

Se tutto ciò che desideri è l'effetto ottico che la casella di testo non ha una selezione blu su tutto il contenuto, seleziona semplicemente nessun testo:

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

Dopodiché, quando si aggiunge contenuto con .Text += "...", non verrà visualizzata alcuna selezione blu.


0

Prova a impostare TabStopsu Falseper il controllo della vista che non è focalizzato.

Ad esempio:

txtEmpID.TabStop = false;

-1

Nel costruttore del Form o UserControl tenendo premuto il TextBox scrivi

SetStyle(ControlStyles.Selectable, false);

Dopo InitializeComponent (); Fonte: https://stackoverflow.com/a/4811938/5750078

Esempio:

public partial class Main : UserControl
{

    public Main()
    {
        InitializeComponent();
        SetStyle(ControlStyles.Selectable, false);
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.