[.NET]Bloccare eventi tasti indesiderati TabControl

lunedì 08 dicembre 2008 - 17.19

gigi90 Profilo | Senior Member

Salve a tutti, ho un TabControl che utilizzo per implementare le multiview di un Wizard nascondendo le linguette delle schede e cambiando la scheda salezionata a secondo dei pulsanti premuti. A questo punto il TabControl ha la funzionalità che quando l'utente preme CTRL+TAB cambia la scheda selezionata, come posso fare per eliminare questa funzionalità?

0v3rCl0ck Profilo | Guru

>Salve a tutti,

Ciao

>ho un TabControl che utilizzo per implementare
>le multiview di un Wizard nascondendo le linguette delle schede
>e cambiando la scheda salezionata a secondo dei pulsanti premuti.
>A questo punto il TabControl ha la funzionalità che quando l'utente
>preme CTRL+TAB cambia la scheda selezionata, come posso fare
>per eliminare questa funzionalità?

Imposti la proprietà KeyPreview = True della form. Successivamente vai a "trappare" la combinazione di tasti CTRL+TAB, e senza eseguire niente in particolare setti e.Handled = True.

In pratica:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Enjoy It

-------------------------------------------------------------------
Michael Denny
Senior Software Developer - Microsoft Framework (C# ASP.NET VB.NET)
http://blogs.dotnethell.it/Regulator/

gigi90 Profilo | Senior Member

Purtroppo nn funziona si scatena lo stesso, prova tu in un applicazione di prova!!!!!

0v3rCl0ck Profilo | Guru

Ti ho messo in allegato l'esempio

-------------------------------------------------------------------
Michael Denny
Senior Software Developer - Microsoft Framework (C# ASP.NET VB.NET)
http://blogs.dotnethell.it/Regulator/

gigi90 Profilo | Senior Member

Metti una Textbox nel primo panel del tuo progetto, dagli il focus col mouse e premi CTRL+TAB, vedrai che scatta, questo perchè si scatena il CTR+TAB sulla TextBox che e figlia del Tab Panel e non del Form, quindi io dovrei gestire il Key_Down per tutti i controlli. Il che è poco pulito, ma mi sa che nn ho altra soluzione

0v3rCl0ck Profilo | Guru

>Metti una Textbox nel primo panel del tuo progetto, dagli il
>focus col mouse e premi CTRL+TAB, vedrai che scatta, questo perchè
>si scatena il CTR+TAB sulla TextBox che e figlia del Tab Panel
>e non del Form, quindi io dovrei gestire il Key_Down per tutti
>i controlli. Il che è poco pulito, ma mi sa che nn ho altra soluzione

Eh si, hai ragione . Anche se da documentazione la proprietà KeyPreview, dovrebbe servire proprio a quello (http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview.aspx), a fare passare tutti gli eventi (keydown, keyup e keypress) prima dalla form e poi ripassarli ai controlli. Evidentemente con il tab control funziona per metà. Ho provato anche a fare una funzione ricorsiva per assegnare a tutti i controlli la funzione per fare l'handle del keydown, ma non funziona, il tab scorre. A questo punto ho decompilato il framework, e ho visto che il TabControl fa l'override del OnKeyDown e ho trovato una soluzione che ha funzionato. Ho creato un custom control che eridità da TabControl, per poi fare l'override della funzione OnKeyDown.

Dato che la funzione originaria è fatta così:

Protected Overrides Sub OnKeyDown(ByVal ke As KeyEventArgs) If ((ke.KeyCode = Keys.Tab) AndAlso ((ke.KeyData And Keys.Control) <> Keys.None)) Then Dim forward As Boolean = ((ke.KeyData And Keys.Shift) = Keys.None) Me.SelectNextTab(ke, forward) End If If ((ke.KeyCode = Keys.Next) AndAlso ((ke.KeyData And Keys.Control) <> Keys.None)) Then Me.SelectNextTab(ke, True) End If If ((ke.KeyCode = Keys.Prior) AndAlso ((ke.KeyData And Keys.Control) <> Keys.None)) Then Me.SelectNextTab(ke, False) End If MyBase.OnKeyDown(ke) End Sub

Non ho fatto altro che mettere in ogni sezione ke.Handled = True, e ho rimosso MyBase.OnKeyDown(ke) che evita di ripassare l'evento alla funzione della classe base.

Protected Overrides Sub OnKeyDown(ByVal ke As System.Windows.Forms.KeyEventArgs) If ((ke.KeyCode = Keys.Tab) AndAlso ((ke.KeyData And Keys.Control) <> Keys.None)) Then ke.Handled = True End If If ((ke.KeyCode = Keys.Next) AndAlso ((ke.KeyData And Keys.Control) <> Keys.None)) Then ke.Handled = True End If If ((ke.KeyCode = Keys.Prior) AndAlso ((ke.KeyData And Keys.Control) <> Keys.None)) Then ke.Handled = True End If End Sub

Mi da un po' noia dover fare così, perchè per così poco farsi un custom control, non è il massimo della vita da programmatore, però se lo lasci all'interno del progetto, poi lo vedi direttamente dai tools e lo puoi trascinare. Forse ho usato un cannone per uccidere una mosca, però decompilando il framework e facendo un po' di prove non mi è venuto in mente di meglio.

In allegato ti ho rimesso l'esempio aggiornato.

Fammi sapere

-------------------------------------------------------------------
Michael Denny
Senior Software Developer - Microsoft Framework (C# ASP.NET VB.NET)
http://blogs.dotnethell.it/Regulator/

gigi90 Profilo | Senior Member

Grazie, sei stato esaustivo...
Potevano mettere una proprietà del tipo EnableCtrlTabChange di tipo Boolean
Eh eh

0v3rCl0ck Profilo | Guru

>Grazie, sei stato esaustivo...
>Potevano mettere una proprietà del tipo EnableCtrlTabChange
>di tipo Boolean
>Eh eh

Eh si, ci voleva proprio poco guardando il codice...Ma sembra proprio non ci sia

Alla prossima
Ciao

-------------------------------------------------------------------
Michael Denny
Senior Software Developer - Microsoft Framework (C# ASP.NET VB.NET)
http://blogs.dotnethell.it/Regulator/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5