>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/