2010-12-13 14 views
6

Tengo una aplicación de formularios C# windows con varios cuadros de texto y un botón. Me gustaría encontrar el cuadro de texto que tiene foco y hacer algo con él. He escrito el siguiente código pero, por supuesto, no funcionará porque el botón se enfocará tan pronto como se presione.Averigüe el control con el último foco

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

El botón también puede obtener el enfoque a través de la tecla Tab presiona. – 26071986

Respuesta

15

No existe una propiedad o funcionalidad incorporada para realizar un seguimiento del control enfocado anteriormente. Como mencionó, cada vez que se hace clic en el botón, tomará el foco. Si desea realizar un seguimiento del cuadro de texto que se enfocó antes de eso, tendrá que hacerlo usted mismo.

Una manera de ir sobre esto sería añadir una variable de nivel de clase a su formulario que contiene una referencia al control de cuadro de texto centrado actualmente:

private Control _focusedControl; 

Y luego, en el caso GotFocus para cada uno de sus controles de cuadro de texto, que se acaba de actualizar la variable _focusedControl con ese cuadro de texto:

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

Ahora, cada vez que se hace clic en un botón (¿por qué utiliza el evento MouseDown como se muestra en su pregunta en lugar de la butto ? Click caso de n), puede utilizar la referencia al control de cuadro de texto centrado previamente que se guarda en la variable de nivel de clase como usted quiera:

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

Se podría tal vez suscribirse al evento GotFocus de sus cuadros de texto, guardar el cuadro de texto (que se obtendría con el parámetro remitente) en un campo, y utilizar este campo cuando se pulsa el botón?

2

me gustaría utilizar el evento button1_MouseHover. Cuando se desencadena este evento, ActiveControl apunta hasta el control anterior, que puede almacenar como _focusedControl.

Por supuesto, esto no funcionará si el usuario presiona el botón.

Cuestiones relacionadas