Scopri il controllo con l’ultimo fuoco

Ho un’applicazione di moduli di Windows # con diverse caselle di testo e un pulsante. Mi piacerebbe scoprire la casella di testo che si concentra e fare qualcosa con esso. Ho scritto il seguente codice ma ovviamente non funzionerà perché il pulsante diventerà attivo non appena viene premuto.

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); } } } } 

Non c’è una proprietà o funzionalità incorporata per tenere traccia del controllo focalizzato precedente. Come hai detto, ogni volta che si fa clic sul pulsante, esso si focalizzerà. Se vuoi tenere traccia della casella di testo che è stata messa a fuoco prima, dovrai farlo tu stesso.

Un modo per risolvere questo problema consiste nell’aggiungere una variabile di livello di class al modulo che contiene un riferimento al controllo della casella di testo attualmente focalizzata:

 private Control _focusedControl; 

E poi nell’evento GotFocus per ciascuno dei controlli della tua casella di testo, dovresti semplicemente aggiornare la variabile _focusedControl con quella casella di testo:

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

Ora, ogni volta che si fa clic su un pulsante (perché si sta utilizzando l’evento MouseDown come mostrato nella domanda invece dell’evento Click del pulsante?), È ansible utilizzare il riferimento al controllo della casella di testo focalizzato in precedenza che viene salvato nella variabile a livello di class come ti piace:

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

Potresti forse iscriverti all’evento GotFocus delle tue caselle di testo, archiviare la casella di testo (che otterresti con il parametro del mittente) in un campo e utilizzare questo campo quando premi il pulsante?

Vorrei utilizzare l’evento button1_MouseHover . Quando questo evento viene triggersto, ActiveControl a puntare al controllo precedente, che è ansible memorizzare come _focusedControl .

Naturalmente, questo non funzionerà se le tabs dell’utente al pulsante.