ActiveControl в форме или контейнере будет возвращать активный элемент управления этой сущности независимо от того, насколько глубоко она может быть вложена в другие контейнеры.
В вашем примере, если TextBox имеет Focus: then: for Form, TableLayoutPanel и FlowLayoutPanel: свойство ActiveControl для всех из них будет TextBox!
Некоторые, но не все, «подлинные» типы ContainerControl ... такие как Form и UserControl ... предоставляют события Key (в случае Form: только если Form.KeyPreview == true их можно использовать).
Другие элементы управления, которые по своей конструкции содержат другие элементы управления, такие как TableLayOutPanel, GroupBox, Panel, FlowLayoutPanel и т. Д., Являются не типом ContainerControl, и они не предоставляют KeyEvents.
Любая попытка привести экземпляров таких объектов, как TextBox, FlowLayoutPanel, TableLayoutPanel непосредственно к ContainerControl, не будет компилироваться: они не являются типом ContainerControl.
Код в принятом ответе и в следующем ответе, который исправляет орфографические ошибки первого ответа, скомпилирует / примет экземпляры вышеупомянутых в качестве параметров, поскольку вы «понижаете» их до типа «Управление путем создания типа параметра». Контроль
Но в каждом случае приведение к ControlContainer будет возвращать ноль, а переданный экземпляр будет возвращен (понижен): по существу, нет операции.
И, да, измененный код ответа будет работать, если вы передадите ему «подлинный» ControlContainer, например экземпляр Form, который находится в пути родительского наследования ActiveControl, но вы все еще просто тратите время, дублируя функцию «ActiveControl.
Итак, что такое «подлинные» Контейнерные Контроли: посмотрите их: Документы MS для Контейнерного Контроля
Только ответ Питера действительно отвечает на явный вопрос, но этот ответ несет цену за использование взаимодействия, и ActiveControl даст вам то, что вам нужно.
Также обратите внимание, что каждый элемент управления (контейнер или не контейнер) имеет коллекцию элементов управления, которая никогда не бывает нулевой, и что многие (я никогда не пробовал все из них: зачем мне?) Базовый элемент управления WinForms позволяет вам делать «сумасшедшие вещи», такие как добавление Controls к ControlCollection «простых» элементов управления, таких как Button, без ошибок.
Теперь, если реальное намерение вашего вопроса было спросить, как найти самый внешний Контейнерный Контроллер ... , которого нет в самой Форме .. обычного неконтейнера Элемент управления вложил несколько произвольных уровней в глубину ... Вы можете использовать некоторые из идей в ответе, но код может быть значительно упрощен.
Регулярные элементы управления, ContainerControls, UserControls и т. Д. (Но не Form!) Имеют свойство «Container», к которому вы можете получить доступ, чтобы получить их непосредственный контейнер, но убедитесь, что у вас есть «final Container» в их пути наследования, который не является Form требуется некоторый код для «обхода» дерева наследования, что продемонстрировано здесь.
Возможно, вы также захотите проверить свойство HasChildren элемента управления, которое обычно полезно при решении проблем с Focus, ActiveControl и Select в WinForms. Здесь может быть полезно рассмотреть разницу между Select и Focus, и у SO есть хорошие ресурсы для этого.
Надеюсь, это поможет.