Domanda

Utilizzando WinForms, ho impostato la proprietà KeyPreview true e avere eventi maniglie per il corretto eventi chiave all'interno del modulo di base pure.

All'interno delle forme che ereditano da essa, ho impostato la proprietà AcceptButton in base ai requisiti dell'applicazione.

Ci sono alcuni casi in cui voglio la chiave per avere funzionalità diversa da quella del AcceptButton entrare.

speravo di catturare la pressione di un tasto entrare nel mio modulo di base e verificare i casi particolari in cui non voglio l'evento AcceptButton al fuoco.

Sembra, però, che l'AcceptButton click viene generato prima uno degli eventi chiave all'interno mia forma basef. Potrei scrivere funzionalità sui fatti click dei possibili acceptbuttons, ma, a mio parere, che sarebbe un hack.

Qualche suggerimento?

Grazie.

È stato utile?

Soluzione

Un altro modo per gestire questa situazione è quello di sovrascrivere il metodo ProcessDialogKey () del modulo in cui è possibile sopprimere l'accettare e / o pulsanti annullare. Ad esempio, Ho un'applicazione con un editor filtro che filtra una griglia in base all'input dell'utente. Voglio che l'utente sia in grado di colpire il tasto di ritorno quando il controllo editor di filtro ha la messa a fuoco per applicare il filtro. Il problema è l'accettare corre codice del pulsante e chiude il modulo. Il seguente codice risolve il problema.

    protected override bool ProcessDialogKey(Keys keyData)
    {
        // Suppress the accept button when the filter editor has the focus.
        // This doesn't work in the KeyDown or KeyPress events.
        if (((keyData & Keys.Return) == Keys.Return) && (filterEditor.ContainsFocus))
            return false;

        return base.ProcessDialogKey(keyData);
    }

Si può prendere questo ancora di più facendo cadere il seguente codice in un modulo di dialogo di base. Poi si può sopprimere il pulsante di accettazione per i controlli in sottoclassi, se necessario.

    private readonly List<Control> _disableAcceptButtonList = new List<Control>();

    protected override bool ProcessDialogKey(Keys keyData)
    {
        if (((keyData & Keys.Return) == Keys.Return) && (_disableAcceptButtonList.Count > 0))
        {
            foreach (Control control in _disableAcceptButtonList)
                if (control.ContainsFocus)
                    return false;
        }

        return base.ProcessDialogKey(keyData);
    }

    protected virtual void DisableAcceptButtonForControl(Control control)
    {
        if (!_disableAcceptButtonList.Contains(control))
            _disableAcceptButtonList.Add(control);
    }

Altri suggerimenti

Come la nostra soluzione, abbiamo catturato l'evento entrare e uscire per il controllo che volevamo avere ignorare la funzionalità AcceptButton. All'interno della manifestazione entrare, si è svolta la corrente pulsante Accetta in una variabile privata e impostare l'AcceptButton a null. In congedo, vorremmo riassegnare l'AcceptButton indietro alla variabile privata ci tenevano.

Gli eventi KeyPreview avrebbero potuto fare qualcosa di simile al precedente. Se qualcuno ha una soluzione più elegante, mi piace ancora di sapere.

Grazie.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top