visual tag tabulacion orden oculto ocultar mostrar formulario form como c# .net winforms

c# - tag - ¿Cómo devuelve el enfoque al último control usado después de hacer clic en un botón en una aplicación winform?



tag c# (7)

Estoy trabajando en una aplicación de formularios de Windows (C #) donde un usuario ingresa datos en un formulario. En cualquier momento mientras edita los datos en el formulario, el usuario puede hacer clic en uno de los botones del formulario para realizar ciertas acciones. De forma predeterminada, el foco se dirige al botón en el que se hace clic para que el usuario tenga que volver a hacer clic en el control que desea editar para continuar modificando los datos en el formulario. Lo que necesito hacer es devolver el enfoque al último control editado después de que se haya procesado el evento de clic de botón. Aquí hay una captura de pantalla de muestra que ilustra de lo que estoy hablando:

El usuario puede ingresar datos en textbox1, textbox2, textbox3, etc. y hacer clic en el botón. Necesito el botón para devolver el foco al control que recientemente tenía el foco antes de hacer clic en el botón.

Me pregunto si alguien tiene una forma mejor de implementar esta funcionalidad que la que se me ocurrió. Esto es lo que estoy haciendo en este momento:

public partial class Form1 : Form { Control _lastEnteredControl; private void textBox_Enter(object sender, EventArgs e) { _lastEnteredControl = (Control)sender; } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Do something here"); _lastEnteredControl.Focus(); } }

Entonces, básicamente, lo que tenemos aquí es una variable de clase que apunta al último control ingresado. Cada cuadro de texto en el formulario se configura para que el método textBox_Enter se active cuando el control recibe el foco. Luego, cuando se hace clic en el botón, el foco vuelve al control que tenía el foco antes de que se hiciera clic en el botón. ¿Alguien tiene más soluciones elegantes para esto?


Creo que lo que estás haciendo está bien. Lo único que podría pensar para mejorarlo sería almacenar cada control en una pila a medida que se accede. Eso le daría una línea de tiempo completa de lo que se accedió.


Por un poco de ''simplicidad'' quizás intente.

public Form1() { InitializeComponent(); foreach (Control ctrl in Controls) { if (ctrl is TextBox) { ctrl.Enter += delegate(object sender, EventArgs e) { _lastEnteredControl = (Control)sender; }; } } }

entonces no tiene que preocuparse de decorar cada cuadro de texto manualmente (u olvidarse de uno también).


Sí, admito que el requisito es un poco inusual. Parte de la información que los usuarios ingresarán en esta aplicación existe en escaneos de documentos antiguos que están en un par de repositorios diferentes. Los botones facilitan la búsqueda y la apertura de estos documentos antiguos. Es difícil predecir dónde estarán los usuarios en el formulario cuando deciden sacar un documento con más información para ingresar en el formulario. La intención es hacer que la UI fluya bien a pesar de estas circunstancias funky.


Su implementación se ve lo suficientemente buena; lo que sí quiero saber es por qué quiere hacer esto en primer lugar. ¿No será preferible que el enfoque vuelva a la primera entrada? ¿Los datos en el último cuadro de texto son tan maleables que una vez que hacen clic en el botón, se "recuerda"? ¿O tiene algún tipo de operación que el botón hace para ese cuadro de texto específico? En ese caso, ¿no debería el foco pasar a un control posterior?

Estoy interesado en descubrir por qué quieres hacer esto en primer lugar.


Tu enfoque se ve bien. Si desea evitar tener que agregar un controlador de eventos a cada control que agregue, puede crear una rutina recursiva para agregar un oyente GotFocus a cada control en su formulario. Esto funcionará para cualquier tipo de control en su forma, sin embargo, puede ajustarlo para satisfacer sus necesidades.

private void Form_OnLoad(object obj, EventArgs e) { AddGotFocusListener(this); } private void AddGotFocusListener(Control ctrl) { foreach(Control c in ctrl.Controls) { c.GotFocus += new EventHandler(Control_GotFocus); if(c.Controls.Count > 0) { AddGotFocusListener(c); } } } private void Control_GotFocus(object obj, EventArgs e) { // Set focused control here }


Podrías hacer lo siguiente

Cambia el botón a una etiqueta y haz que se vea como un botón. La etiqueta nunca se enfocará y no tiene que hacer toda la codificación adicional.


Crea una clase llamada CustomTextBox que hereda de TextBox. Tiene una variable estática llamada pila. Cuando el cuadro de texto pierde foco, presiona en la pila. Cuando desee encontrar el último control enfocado, solo saque el primer elemento de la pila. Asegúrese de borrar la variable Stack estática.