2009-07-16 19 views
92

Devo rimuovere lo stato attivo da diversi TextBox. Ho provato ad utilizzare:Come rimuovere lo stato attivo da un controllo TextBox in WinForms?

textBox1.Focused = false; 

il valore della proprietà è ReadOnlytrue.

Ho poi provato la messa a fuoco della maschera, in modo da rimuoverlo da tutte le TextBoxes, ma questo non riesce anche a lavorare:

this.Focus(); 

e la funzione restituisce false quando viene selezionata una casella di testo.

Quindi, come rimuovere lo stato attivo da un controllo TextBox?

risposta

93

È necessario un altro controllo focalizzabile per spostare lo stato attivo su.

Si noti che è possibile impostare la messa a fuoco su un'etichetta. Potresti considerare dove vuoi il tasto [Tab] per portarlo avanti.

Si noti inoltre che non è possibile impostarlo sul modulo. I controlli del contenitore come Form e Panel passeranno il Focus al loro primo controllo figlio. Quale potrebbe essere il TextBox da cui vuoi allontanarti.

+0

Grazie; Ho appena provato a focalizzare l'attenzione su un'etichetta e ora la casella di testo diventa sfocata. Sembra che non puoi concentrarti su un modulo per qualche motivo. –

+7

Controlli contenitore (modulo, pannello) passeranno l'attivo al primo controllo figlio. –

+0

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 sta prendendo input da un cardreader, quindi se l'attenzione si allontana dal modulo stesso, allora si scatena l'inferno.Concentrarsi su un'etichetta dopo aver premuto un pulsante per risolvere il problema. Grazie mille! – joelc

30

Provare a disabilitare e abilitare la casella di testo.

+5

Questo funziona piuttosto liscia come si seleziona automaticamente il controllo successivo nella lista scheda nel frattempo. – Nick

+3

Sto sviluppando in Silverlight utilizzando MVVM e l'ho implementato utilizzando un comportamento mirato a un controllo TextBox. Poiché non avevo un altro UIElement a portata di mano per mettere a fuoco la soluzione Disabilita/Abilita, abbiamo fatto miracoli. Grazie! –

+2

funziona come un fascino – grabah

8

Focus imposta lo stato attivo di input, pertanto l'impostazione sul modulo non funzionerà perché i moduli non accettano input. Prova a impostare la proprietà ActiveControl del modulo su un controllo diverso. È anche possibile utilizzare Select per selezionare un controllo specifico o SelectNextControl per selezionare il controllo successivo nell'ordine di tabulazione.

+1

Ho provato tutto il resto qui e 'Select()' ha funzionato per me. –

+0

@Derek W sei l'uomo –

3

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

Prova che:

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

Concentrandosi in etichetta non ha funzionato per me, fare qualcosa di simile label1.Focus() giusto? la casella di testo deve ancora mettere a fuoco durante il caricamento del modulo, tuttavia cercando Velociraptors risposta, ha funzionato per me, l'impostazione di controllo attivo del form per l'etichetta in questo modo:

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

vorrei poterti dare milioni di frecce in su. Ho provato TUTTO quello che la gente ha suggerito, questo è l'unico che ha funzionato. per qualche motivo, la casella di testo SEMPRE ha rubato la messa a fuoco da tutto ... – eladyanai

+3

Funziona anche per i controlli del contenitore come i pannelli. Volevo solo rimuovere completamente lo stato attivo e ha funzionato: 'this.ActiveControl = panelOnMyForm;' –

+0

Impressionante! Grazie ha lavorato per me :) –

3

Sembra che non ho per impostare il concentrarsi su altri elementi. Su un'applicazione Windows Phone 7, ho utilizzato il metodo Focus per disinserire Focus di una casella di testo.

Dare il seguente comando imposterà la messa a fuoco su niente:

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 io non so perché non ha funzionato per voi:/

6

provare questo ..

primo set up ordine di tabulazione ..

quindi nell'evento di caricamento del modulo possiamo inviare una pressione del tasto di tabulazione programmaticamente all'applicazione. in modo che l'applicazione dia il focus al 1 ° controllo nell'ordine di tabulazione.

nel caricamento del modulo anche scrivere questa riga.

SendKeys.Send("{TAB}"); 

questo ha funzionato per me.

+0

Ottima soluzione! – Yuriy

3

Una soluzione semplice sarebbe quella di uccidere la messa a fuoco, basta creare la propria 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); 
    } 
} 
+0

Esattamente il tipo di soluzione che stavo cercando. Grazie! – LeftyCoder

12

È anche possibile impostare le forme activecontrol proprietà null come

ActiveControl = null; 
+2

Spero che le persone scorrano fino a questo punto e che non utilizzino solo la soluzione alternativa contrassegnata come risposta – makoshichi

3

Ho fatto questo sul mio controllo personalizzato, ho fatto questo onFocus()

this.Parent.Focus(); 

Quindi se te focalizzato su xbox - mette immediatamente in primo piano la casella di testo del genitore (modulo o pannello ...) Questa è una buona opzione se vuoi farlo sul controllo personalizzato.

+0

Questo ha funzionato per me. –

+0

nvm:/I use ActiveControl = null; –

4

Questo post mi portano a fare questo:

ActiveControl = null; 

Questo mi permette di catturare tutti gli input della tastiera al livello superiore, senza altri controlli andare dadi.

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

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

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

29

È possibile aggiungere il seguente codice:

this.ActiveControl = null; //this = form 
+4

Credo che questa sia la migliore risposta. Molti altri metodi come "Focus" se si legge 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 riga. – Rostov

+0

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

1

si può fare questo da due metodo di

  • solo fare le proprietà "TabStop" di testo desiderata per falso ora non si concentrerà anche se hai campo
  • trascinare due casella di testo un testo

    1. fare uno visibile su cui non si vuole foucus che è textbox1
    2. rendono il 2 ° uno invisibile e andare alle proprietà di quel campo di testo e selezionare

valore di tabIndex a 0 di TextBox2

  1. e selezionare il tabindex del TextBox1 a 1 ora non si concentrerà sulla textbox1
0

Se invece si è l'effetto ottico che la casella di testo non ha alcuna selezione blu in tutto il suo contenuto, basta selezionare nessun testo:

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

Dopo questo, quando l'aggiunta di contenuti con .Text += "...", nessuna selezione blu sarà mostrato.

0

Si prega di provare TabStop a False per il controllo della vista che non è mirato.

Per esempio:

txtEmpID.TabStop = false; 
-1

Nel costruttore della maschera o UserControl tiene TextBox scrittura

SetStyle(ControlStyles.Selectable, false); 

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

Esempio:

public partial class Main : UserControl 
{ 

    public Main() 
    { 
     InitializeComponent(); 
     SetStyle(ControlStyles.Selectable, false); 
    } 
Problemi correlati