2011-01-04 13 views
33

frage ich mich, warum dieser Code die Textbox nicht fokussiert ...?textbox.Focus() funktioniert nicht 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

Der von Ihnen gepostete Code wird nicht kompiliert - die beste Überladungsübereinstimmung für den Aufruf "MessageBox.Show" weist einige ungültige Argumente auf. Sobald das behoben ist (ich habe eine Beschriftung angegeben), funktioniert der Code genau wie erwartet und setzt den Fokus auf die Textbox. Was ist das Problem? Soll der bereits eingegebene Text * ausgewählt * sein? –

+0

@Cody: seine bearbeitet ... überprüfen Sie jetzt :) –

+0

Wie schon gesagt, auch wenn ich den Aufruf an "MessageBox.Show" durch Hinzufügen einer Überschrift Zeichenfolge (genau das gleiche, was Sie getan haben), funktioniert der Code immer noch gut. Nachdem das Meldungsfeld angezeigt wird, wird der Fokus auf das Textfeld zurückgesetzt. Warum sagst du, dass es "nicht funktioniert"? Haben Sie gehofft, dass der Text, der in das Textfeld eingegeben wurde, ausgewählt/hervorgehoben wird? –

Antwort

86

Verwenden Select() statt:

recipientEmail_tbx.Select(); 

Focus ist ein Low-Level-Methode in erster Linie für die individuelle Steuerung Autoren gedacht. Stattdessen sollten Anwendungsprogrammierer die Methode oder die ActiveControl-Eigenschaft für untergeordnete Steuerelemente oder die Activate-Methode für Formulare verwenden.

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

+0

thanks..Form ging aus dem Fokus, wenn Nachricht Box erscheint ... –

+2

'Fehler Nein Überladung für die Methode 'Select' dauert 0 Argumente \t ' –

+1

Die parameterlose Überladung existiert seit 1.1: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.select.aspx – Alfie

2

Auch habe ich versucht, mit vielen oben genannten Lösungen, aber keiner von ihnen arbeitete für mich als ich versuchte, auf Seite Last zu konzentrieren. Endlich habe ich diese Lösung und es hat funktioniert.

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

Add Delay einige miliSec. Verzögern Sie dann Anruf Focus() und vergessen Sie nicht, innerhalb Dispatcher zu setzen.

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