2010-12-13 5 views
6

Ich habe eine C# Windows Forms-Anwendung mit mehreren Textfeldern und einer Schaltfläche. Ich möchte die Textbox herausfinden, die den Fokus hat und etwas damit macht. Ich habe den folgenden Code geschrieben, aber es wird natürlich nicht funktionieren, weil die Schaltfläche den Fokus erhält, sobald sie gedrückt wird.Finden Sie das Steuerelement mit dem letzten Fokus

private void button1_MouseDown(object sender, MouseEventArgs e) 
{ 
    foreach (Control t in this.Controls) 
    { 
     if (t is TextBox) 
     { 
      if (t.Focused) 
      { 
       MessageBox.Show(t.Name); 
      } 
     } 
    } 
} 
+1

Schaltfläche kann auch Fokus über Tab drücken. – 26071986

Antwort

15

Es gibt keine eingebaute Eigenschaft oder Funktionalität, um das zuvor fokussierte Steuerelement im Auge zu behalten. Wie Sie bereits erwähnt haben, wird der Fokus immer dann verwendet, wenn auf die Schaltfläche geklickt wird. Wenn Sie die zuvor fokussierte Textbox im Auge behalten möchten, müssen Sie dies selbst tun.

Ein Weg, um diesen zu gehen, wäre eine Variable auf Klassenebene zu Ihrem Formular hinzuzufügen, die einen Verweis auf die aktuell den Fokus Textbox Kontrolle hält:

private Control _focusedControl; 

Und dann im GotFocus Ereignisse für jedes Ihrer Textboxsteuerelemente, würden Sie nur aktualisieren, um den _focusedControl Variable mit diesem Textfeld:

private void TextBox_GotFocus(object sender, EventArgs e) 
{ 
    _focusedControl = (Control)sender; 
} 

Nun, wenn eine Schaltfläche geklickt wird (warum verwenden Sie das MouseDown Ereignis wie in Ihrer Frage an Stelle des butto gezeigt ? N der Click Ereignis), können Sie den Verweis auf die zuvor konzentriert Textbox-Steuerelement verwenden können, die aber in der Klasse-Level-Variable gespeichert Sie mögen:

private void button1_Click(object sender, EventArgs e) 
{ 
    if (_focusedControl != null) 
    { 
     //Change the color of the previously-focused textbox 
     _focusedControl.BackColor = Color.Red; 
    } 
} 
3

Sie vielleicht zu dem GotFocus-Ereignisse des Textfeldes zeichnen könnten, speichern Sie die Textbox in einem Feld (Sie mit dem Absender Parameter bekommen würden), und dieses Feld verwenden, wenn Sie Ihre Taste drücken?

2

ich das button1_MouseHover Ereignis verwenden würde. Wenn dieses Ereignis ausgelöst wird, zeigt ActiveControl bis zum vorherigen Steuerelement, das Sie als _focusedControl speichern können.

Natürlich funktioniert dies nicht, wenn der Benutzer auf die Schaltfläche wechselt.

Verwandte Themen