2011-09-14 17 views
5

Ho un problema con l'impostazione dello stesso gestore di eventi per tutti i controlli nel modulo. Voglio gestire i pulsanti F5-F7 in modo uniforme nella mia applicazione, quindi cerco di registrare lo stesso gestore di eventi per tutti i controlli del modulo. Ho inseritoUn gestore di eventi per tutti i controlli nel modulo

foreach (System.Windows.Forms.Control cont in this.Controls) 
       cont.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MainForm_KeyPress); 

a InitializeComponent funzione() appena prima generato automaticamente ResumeLayout/PerformLayout chiamate. Non importa il nome MainForm_KeyPress, in realtà è un gestore di eventi KeyDown ora.

Ho anche provato ad inserire il codice nella mia funzione init() chiamata dal costruttore. Ma il risultato è stato lo stesso: l'evento non si verifica quando premo i tasti. L'accento è posto su uno dei pulsanti del modulo.

Tuttavia, se si implementa il gestore per uno dei pulsanti mediante lo strumento di progettazione (nome della funzione copia nel campo evento KeyPress), l'evento viene generato correttamente se il pulsante è a fuoco.

Qualche idea sul perché foreach non ha funzionato?

+3

Un gestore di eventi per domarli tutti? – jason

+0

Si prega di non aggiungere il prefisso ai titoli con "C#:". Ecco a cosa servono i tag. –

+0

@Jason - e nel buio i dati li legano. – TrueWill

risposta

6

MSDN dice che si può fare con l'impostazione KeyPreview su true.

+0

Questa sembra la strada da percorrere, avresti solo una registrazione di un evento, a livello di modulo. Assicurati di impostare e.Handled su true per gli eventi chiave effettivamente gestiti (per evitare le doppie azioni) e false per tutti gli altri (o disabiliterai tutte le altre interazioni da tastiera che penso).Il codice di esempio in MSDN è un po 'semplicistico nel modo in cui lo imposta su falso in tutti i casi. – rice

+0

@Ingenu grazie! Una risposta così semplice! – HtonS

+0

@Ingenu grazie mille –

1

Forse è necessario reclicarlo e registrarlo per i controlli figlio di ciascun controllo che si incontra, lungo l'albero?

La prima cosa che farei avendo questo problema è mettere {} intorno alla registrazione e uscita "ora registrando per" + il nome del controllo. In questo modo puoi vedere e vedere quanti controlli vengono registrati e quali sono. Forse è solo il pannello principale, e i subcontrol elaborano la chiave? Ho avuto problemi con i gestori di eventi chiave della stampa anche quando lavoravo in un gestore del dock, il gestore del dock stava gestendo la tastiera su un altro livello e instradando l'evento al controllo figlio specifico che pensava dovesse averlo.

Se ancora non lo si capisce, la prossima cosa che farei è collegare gli eventi del modulo, o forse anche monitorare gli eventi del messaggio Windows WM_. Ad un certo punto WM_ viene tradotto in un evento .NET in base al codice, e questo può essere implementato in modi che non ti aspetti, e dirottato da controlli di terze parti, ecc. Il sistema operativo deve instradare gli eventi WM_ al tuo processo , quindi seguirli con gestori di eventi pass-through che registrano ciò che passa.

Ho dimenticato esattamente come funziona, ma durante l'elaborazione di un evento come un tasto di pressione, è possibile restituire un bool o impostare un flag sull'evento dicendo che l'hai gestito, e nell'implementazione di dockmanager ho visto se hai detto che gestito, il ciclo che stava passando l'evento ai controlli figlio si fermava, rafforzando l'idea che solo una azione doveva essere attivata dall'evento tastiera.

+0

Ho visto prima la tua risposta e ho seguito il tuo consiglio per verificare se tutti i controlli sono stati elaborati in foreach. Avevi ragione, i controlli figli non erano registrati. Così ho aggiunto una ricorsione, e tutto ha funzionato bene. Ma la risposta di Ingenu è più semplice, quindi la userò =) Grazie ancora! È un peccato non poter contrassegnare due post come risposta – HtonS

Problemi correlati