2011-01-04 17 views
33

mi chiedo perché questo codice non riesce a mettere a fuoco la casella di testo ...?textbox.Focus() non funziona in C#

private void sendEmail_btn_Click(object sender, EventArgs e) 
{  
    String sendTo = recipientEmail_tbx.Text.Trim(); 
    if (!IsValidEmailAddress(sendTo)) 
    { 
     MessageBox.Show("Please Enter valid Email address","Cognex" MessageBoxButtons.OK, MessageBoxIcon.Error);     
     recipientEmail_tbx.Focus(); 
    } 
} 
+3

Il codice che hai postato non viene compilato, la migliore corrispondenza di sovraccarico per la chiamata 'MessageBox.Show' ha alcuni argomenti non validi. Una volta risolto (ho specificato una didascalia), il codice funziona esattamente come previsto e imposta l'attenzione sulla casella di testo. Qual è il problema? Vuoi che il testo che è già stato inserito appaia * selezionato *? –

+0

@Cody: il suo modificato ... controlla ora :) –

+0

Come ho detto, anche una volta che ho corretto la chiamata a 'MessageBox.Show' aggiungendo una stringa di sottotitoli (esattamente la stessa cosa che hai fatto), il codice funziona ancora bene. Una volta visualizzata la finestra di messaggio, lo stato attivo torna alla casella di testo. Perché dici che "non funziona"? Stavi sperando che il testo che è stato inserito nella casella di testo appaia selezionato/evidenziato? –

risposta

86

Uso Select() invece:

recipientEmail_tbx.Select(); 

Focus è un metodo a basso livello destinato principalmente per gli autori di controllo personalizzati. I programmatori delle applicazioni devono invece utilizzare il metodo Select o ActiveControl per i controlli figlio o il metodo Activate per i moduli.

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx

+0

grazie..Form stava andando fuori fuoco quando la finestra di messaggio appare ... –

+2

'Errore No overload per il metodo 'Select' richiede 0 argomenti \t ' –

+1

Il sovraccarico senza parametri esiste dal 1.1: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.select.aspx – Alfie

2

Anche ho provato con un sacco di soluzioni di cui sopra, ma nessuno di loro ha lavorato per me come sto cercando di mettere a fuoco il caricamento della pagina. Finalmente ho avuto questa soluzione e ha funzionato.

private void txtBox_LayoutUpdated(object sender, EventArgs e) 
{ 
    txtBox.Focus(); 
} 
0

aggiungere un ritardo un po 'miliSec. Ritarda quindi chiama Focus() e non dimenticare di mettere all'interno di Dispatcher.

Task.Delay(100).ContinueWith(_ => 
    { 
     Application.Current.Dispatcher.Invoke(new Action(() => 
     { 
      TextBoxNAme.Focus(); 
     })); 
    });