ActiveControl sur un formulaire ou un conteneur sera renvoie le contrôle actif de cette entité, quelle que soit la profondeur de son imbrication dans d'autres conteneurs.
Dans votre exemple, si le TextBox a le Focus : alors : pour le Form, le TableLayoutPanel et le FlowLayoutPanel : la propriété 'ActiveControl de tous sera la TextBox !
Certains, mais pas tous les "véritables" types de ContainerControl ... comme Form et UserControl ... exposent des événements clés (dans le cas de Form : ils ne peuvent être utilisés que si Form.KeyPreview == true) .
D'autres contrôles qui, par conception, contiennent d'autres contrôles comme TableLayOutPanel, GroupBox, Panel, FlowLayoutPanel, etc. no de type ContainerControl, et ils n'exposent pas les KeyEvents.
Toute tentative de lancer instances d'objets comme TextBox, FlowLayoutPanel, TableLayoutPanel directement à ContainerControl ne compileront pas : ils ne sont pas de type ContainerControl.
Le code dans la réponse acceptée, et dans la réponse suivante qui corrige les fautes d'orthographe de la première réponse, compilera/acceptera les instances des éléments ci-dessus en tant que paramètres parce que vous les "downcasting" au type 'Control en faisant du paramètre le type 'Control
Mais dans chaque cas, le cast vers ControlContainer retournera null, et l'instance passée sera retournée (downcasted) : essentiellement un no-op.
Et, oui, le code de réponse modifié fonctionnera si vous lui passez un "véritable" ControlContainer, comme une instance de Form, qui se trouve dans le chemin d'héritage parent de l'ActiveControl, mais vous perdez toujours du temps à dupliquer la fonction de 'ActiveControl'.
Qu'est-ce qu'un "vrai" ContainerControls : vérifiez-le : Documentation MS pour ContainerControl
Seule la réponse de Peter répond réellement à la question explicite, mais cette réponse implique l'utilisation de l'interopérabilité, et 'ActiveControl vous donnera ce dont vous avez besoin.
Notez également que chaque contrôle (conteneur ou non-conteneur) possède une collection de contrôles qui n'est jamais nulle, et que beaucoup (je ne les ai jamais tous essayés : pourquoi le ferais-je ?) des contrôles WinForms de base vous permettent de faire des "trucs fous" comme ajouter des contrôles à la collection de contrôles de contrôles "simples" comme les boutons sans erreur.
Maintenant, si le véritable intention de votre question était de savoir comment trouver le ContainerControl le plus à l'extérieur. ... qui n'est pas sur le formulaire lui-même ... d'un non-conteneur régulier Contrôle imbriqué à quelques niveaux arbitraires de profondeur ... vous pouvez utiliser certains des idées dans la réponse : mais le code peut être grandement simplifié.
Les contrôles réguliers, les ContainerControls, les UserControls, etc. (mais pas les Form !) ont tous une propriété 'Container à laquelle vous pouvez accéder pour obtenir leur conteneur immédiat, mais s'assurer que vous avez le 'conteneur final dans leur chemin d'héritage qui n'est pas un Form nécessite du code pour "remonter" l'arbre d'héritage, ce qui est démontré ici.
Vous pouvez également consulter la propriété 'HasChildren' de 'Control' qui est généralement utile pour traiter les questions de Focus, ActiveControl et Select dans WinForms. L'examen de la différence entre Select et Focus peut être utile ici, et SO a quelques bonnes ressources à ce sujet.
J'espère que cela vous aidera.