Come si fa a tornare in primo piano l’ultimo controllo dopo il clic di un pulsante in una winform app?

Sto lavorando su un’applicazione windows forms C#) dove un utente l’immissione di dati in un form. In qualsiasi punto durante la modifica di dati in forma l’utente può fare clic su uno dei pulsanti del modulo per eseguire determinate azioni. Per impostazione predefinita, la messa a fuoco va cliccato il pulsante in modo che l’utente deve fare clic su indietro per il controllo che si desidera modificare per continuare a modificare i dati del modulo. Che cosa ho bisogno per essere in grado di fare è tornare in primo piano l’ultima modifica di controllo dopo l’evento click del pulsante è stato elaborato. Ecco uno screenshot di esempio che illustra di cosa sto parlando:

Come si fa a tornare in primo piano l'ultimo controllo dopo il clic di un pulsante in una winform app?

L’utente può inserire i dati in textbox1, textbox2, textbox3, ecc e fare clic sul pulsante. Ho bisogno il pulsante per tornare alla messa a fuoco posteriore per il controllo che più di recente ha avuto il fuoco prima che il pulsante è stato premuto.

Mi chiedo se qualcuno ha un modo migliore di implementazione di questa funzionalità di quello che ho creato. Ecco quello che sto facendo adesso:

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


    }

Quindi, fondamentalmente, ciò che abbiamo qui è una variabile di classe che indica l’ultimo entrato controllo. Ogni casella di testo nel modulo è configurato in modo che il textBox_Enter metodo è generato quando il controllo riceve il focus. Quindi, quando si fa clic sul pulsante messa a fuoco viene restituito il controllo che aveva la messa a fuoco prima che il pulsante è stato premuto. Qualcuno ha qualche più eleganti soluzioni per questo?

OriginaleL’autore Joe Barone | 2008-09-01

7 Replies
  1. 16

    Per un po ‘di ‘ semplicità’ forse provare.

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

    quindi non è necessario preoccuparsi di decorare ogni textbox manualmente (o dimenticare uno di troppo).

    Hai bisogno di ricorsione.

    OriginaleL’autore Joshua Turner

  2. 2

    Si potrebbe fare il seguente

    Cambiare il pulsante di una etichetta e farlo sembrare come un pulsante. L’etichetta non potrà mai ottenere la messa a fuoco e non è necessario fare tutti gli extra di codifica.

    OriginaleL’autore

  3. 1

    Penso che quello che stai facendo va bene. L’unica cosa che ho potuto pensare di migliorare sarebbe per memorizzare ogni controllo in un mazzo come vi si accede. Che ti dia una completa linea di tempo di quello che è stato accessibile.

    OriginaleL’autore Ethan Gunderson

  4. 1

    Il tuo approccio sembra buono. Se si vuole evitare di dover aggiungere un gestore eventi per ogni controllo che si aggiunge, si potrebbe creare una routine ricorsiva per aggiungere un Attivato ascoltatore ad ogni controllo nel modulo. Questo funziona per qualsiasi tipo di controllo nel modulo, ma è possibile regolare per soddisfare le vostre esigenze.

    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
    }

    OriginaleL’autore Dan Herbert

  5. 0

    Implementazione guarda bene, quello che voglio sapere è perché si vuole fare questo, in primo luogo? Non sarà preferibile per la messa a fuoco per il ciclo per la prima voce? I dati nell’ultima casella di testo così malleabile che una volta che si fa clic sul pulsante, viene “ricordato”? O avete qualche tipo di operazione che il pulsante non ha a che specifici casella di testo dati … in quel caso non dovrebbe il focus andare ad un successivo controllo, invece?

    Sono interessati a capire perché si vuole fare questo, in primo luogo.

    OriginaleL’autore Jon Limjap

  6. 0

    Sì, ammetto che il requisito è un po ‘ insolito. Alcune delle informazioni che gli utenti potranno essere entrata in questa applicazione esiste in scansioni di vecchi documenti che sono in un paio di diversi archivi. I pulsanti di facilitare la ricerca e l’apertura di questi antichi documenti. È difficile prevedere dove gli utenti saranno in forma quando si decide di tirare un documento con ulteriori informazioni per entrare in forma. L’intento è quello di rendere l’interfaccia di flusso, nonostante questi funky circostanze.

    OriginaleL’autore Joe Barone

  7. 0

    Creare una classe chiamata CustomTextBox che eredita dalla casella di testo. È una variabile statica chiamata stack. Quando la textbox perde la messa a fuoco push sullo stack. Quando si desidera trovare l’ultimo concentrato di controllo, quindi basta inserire il primo elemento dalla pila. Assicurarsi di deselezionare l’elenco statico variabile.

    OriginaleL’autore Denis

Lascia un commento